栈(stack)的应用场景

概念

(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】
  1. 初始化两个空栈,栈S1:存储运算符;栈S2存储操作数据(数值)
  2. 从左至右扫描中缀表达式;
  3. 扫描到到操作数据,压入栈S2;
  4. 扫描到到运算符时,比较运算符与其S1栈顶运算符的优先级;
    (1)如S1为空 或 S1栈顶运算符为左括号( ,则将运算符入栈S1
    (2)如运算符优先级高于S1栈顶运算符,则将运算符入栈S1
    (3)如运算符优先级不高于栈顶运算符,则将S1栈顶运算符入栈S2;然后重新执行(1)步骤向下判断;
    (4)如遇到右括号),则将S1栈顶运算符入栈S2,直到遇到左括号为止,此时将一堆括号()丢弃;
  5. 重复(2)至(4)步骤,直到扫描至表达式最右侧,然后将栈S1剩余运算符依次弹出并压入栈S2
  6. 最后,依次弹出栈S2中的元素,结果的逆序即为中缀表达式对应的后缀表达式;

  • 综合计算器(逆波兰表达式)
  1. 从左至右扫描表达式,遇到数字时直接压入栈;
  2. 遇到运算符时,弹出栈顶两个数(栈顶元素次顶元素),并使用运算符进行相应的运算,并将计算结果入栈;
  3. 重复上述步骤至表达式最右端,最后运算出来的值即为表达式的结果;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容