栈的链式存储结构(简称链栈)
一般把栈顶放在单链表的头部,对于链栈来说不需要头结点,且基本不存在栈满的情况,除非是内存已经没有可用的空间了,对空栈来说链表原定义是头指针指向空,链栈的空就是top = null
链栈的操作和绝大多数单链表相同,只是插入和删除特殊一些
栈的链式存储结构——进栈和出栈操作
栈的顺序存储结构和链式存储结构的时间复杂度均为O(1),如果栈的使用过程中元素变化不可预料,有时小有时打,最好用链栈,如果变化在可控范围内则用顺序栈
栈的应用-递归(经典递归例子 斐波那契数列实现)
递归定义:把一个直接调用自己或通过一系列的调用语句间接的调用自己的函数叫做递归函数,每个递归函数必须至少要有一个条件,满足条件时递归不在进行,返回值退出,不然会进入无限循环
迭代和递归的区别:迭代使用的是循环结构,递归使用的是选择结构,递归结构更清晰更简洁,但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存,迭代则不需要
递归和栈的关联:在前行阶段,对于每一层递归,函数的局部变量,参数值以及返回地址都被入栈,在退回阶段,位于栈顶的局部变量,参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分
栈的应用——四则运算表达式求值
1后缀(逆波兰)表示法定义
加减乘除比如 9+(3-1)*3+10/2 对计算机来说困难在于乘除在加减的后面要先运算还有括号要处理 用栈结构正好处理,只要碰到左括号就进栈,后面出现右括号就出栈,期间让数字运算。但先乘除再加减的问题依然复杂
波兰逻辑学家发明了一种不需要括号的后缀表达式,称为逆波兰对于上面的计算用后缀表达式表达为 9 3 1 - 3* + 10 2/+ 这样的表达式叫后缀表达式,所有的运算符号必须在运算数字的后面出现
2后缀表达式的计算结果
后缀表达式 :9 3 1 - 3* + 10 2/+
规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到符号就将处于栈顶的两个数字出栈进行运算,运算结果进栈
原文:https://www.cnblogs.com/summervan/p/8781102.html