栈的概念
栈的定义: 只允许在一端,做插入或删除操作的一种线性表。
栈顶:就是栈中允许进行插入删除的一端
栈底:固定位置,不允许操作。
数据结构分析
逻辑结构:线性表 存储结构:顺序存储、链式存储 运算:正常入栈出栈
类型:顺序栈 共享栈(两个栈底在两端,两边栈顶向中间延伸) 链式栈
链式栈一般栈顶在链表的头结点,最终指向栈底结点。
其中共享栈是用了更有效地利用存储空间。其存取效率没有影响 即O(1)
考点
1.出入栈的过程
模拟计算机出入栈就好了
2.判断出栈序列的合法性
判断合法性的一个关键手段就是 分析第一个出栈的元素,它决定了在它(比它早入栈)下面元素 的出栈相对顺序
3.栈的常见应用
(1)括号匹配
(2)表达式求值
- 求解一个 中缀表达式 需要两个栈,一个运算符号栈,一个运算值栈
- 求解 中缀表达式 转换为 后缀表达式,需要一个栈
算法详解
栈存放待确定的运算符
1遇到数字直接加入后缀表达式
2遇到运算符A,则需要与栈顶符号比较运算优先级,A若大于栈顶运算符优先级,则A入栈。否则从栈顶开始依次弹出优先级大于等于当前运算符A的元素,直到一个比它优先级低或左括号。
3遇到'('直接入栈
4遇到')' 依次把栈中元素弹出加入后缀表达式。
手写做法:
给所有运算如 a*b 加括号,并把运算移到括号前面(即为前缀表达式),移到括号后面(即为后缀表达式)
- 求解一个 后缀表达式,需要一个栈
这个简单,弹出两个数字和一个运算符号计算就完了。
(3)递归的应用
斐波那契递归
(但是斐波那契也可以用循环实现)