概念
栈(Stack)是一种遵循后进先出(LIFO,Last-In-First-Out)原则的数据结构,它只允许在一端进行插入和删除操作。这一端被称为栈顶,相对的另一端称为栈底。
基本操作
- Push:将元素添加到栈的顶部。
- Pop:移除并返回栈顶的元素。
- Peek/Top:返回栈顶元素但不移除。
- IsEmpty:检查栈是否为空。
- Size:返回栈中元素的数量。
应用场景
方法调用:在程序执行过程中,每个方法的调用和返回都需要使用栈来管理。当一个方法被调用时,其相关信息(如参数、局部变量和返回地址)被压入栈中,方法执行完毕后,栈顶的信息被弹出,程序继续执行调用者方法;
表达式求值:在编译器、解释器和计算器等应用中,栈常用于表达式的求值。
《逆波兰表达式》
例如:中缀表达式转换为后缀表达式时使用栈来存储操作符,并按照优先级进行运算;
递归调用:在递归算法中,系统调用自身的次数和参数状态通过栈来管理。当递归调用结束时,系统会按照栈的顺序返回结果;
浏览器前进、后退 :在浏览器中,前进和后退功能依赖于栈的数据结构。每当用户浏览新的页面时,新的页面地址被压入栈中,返回操作则是从栈中弹出当前页面地址;
撤销、重做动作:在文本编辑器中,撤销操作通常使用栈来保存之前的操作,重做操作则是恢复之前保存的操作;
逆波兰表达式
- 中缀表达式 转 后缀表达式(波兰表达式) 【2 +(3 + 5 + 10)* 4 - 1】 ····> 【2 3 5 + 10 + 4 * + 1 - 】 结果【73】
- 初始化两个空栈,栈S1:存储运算符;栈S2存储操作数据(数值)
- 从左至右扫描中缀表达式;
- 扫描到到操作数据,压入栈S2;
- 扫描到到运算符时,比较运算符与其S1栈顶运算符的优先级;
(1)如S1为空 或 S1栈顶运算符为左括号( ,则将运算符入栈S1;
(2)如运算符优先级高于S1栈顶运算符,则将运算符入栈S1;
(3)如运算符优先级不高于栈顶运算符,则将S1栈顶运算符入栈S2;然后重新执行(1)步骤向下判断;
(4)如遇到右括号),则将S1栈顶运算符入栈S2,直到遇到左括号为止,此时将一堆括号()丢弃;- 重复(2)至(4)步骤,直到扫描至表达式最右侧,然后将栈S1剩余运算符依次弹出并压入栈S2
- 最后,依次弹出栈S2中的元素,结果的逆序即为中缀表达式对应的后缀表达式;
- 综合计算器(逆波兰表达式)
- 从左至右扫描表达式,遇到数字时直接压入栈;
- 遇到运算符时,弹出栈顶两个数(栈顶元素 和 次顶元素),并使用运算符进行相应的运算,并将计算结果入栈;
- 重复上述步骤至表达式最右端,最后运算出来的值即为表达式的结果;