平时我们很少接触到一个栈的使用,但是今天看了如下三个例子后感触颇深,对于栈应用的情况理解更深了。分享如下:
1、平衡符号
平衡是个动词,意思就是用来平衡符号的,例如关于方法里{}左右大括号的匹配问题,在许多的语言里一旦发生缺少{}很难找到错误的位置,我们这样来平衡符号,当读到{[(时压入栈中如果遇到)]}时则弹出栈,但是如果弹出的栈和触发弹出栈的符号不匹配这就说明符号不平衡:
2、后缀表达式
在计算机里如何计算具有优先级的数学公式成了问题,带有括号的更加复杂。所用的时间肯定大于O(n)。那么我们需要一种表达式来简化计算时间那就是后缀表达式
如:3+2*6=15(中缀表达式)326*+=15(中缀表达式)
其计算方式如下:
那么如何把中缀表达式转换成后缀表达式呢
1、遇到字符输出遇到操作符和“(”压栈
2、当压入一个栈的时候如果栈顶元素比压入栈的元素优先度高则开始弹出栈直到栈顶元素的优先级小于压栈元素
3、“(”只有遇到“)”才开始弹栈,并且只弹到“(”,左右括号都不输出(默认左括号优先度最高)
3、方法调用
还记得我们在java本地方法栈中讲解的么,如果不记得了请见Jvm内存分配。在这里面我们就应用了栈作为方法的调用,接下来我们详细说一说栈,举个比较常见的例子
在递归的时候,当我们要进入下一个方法的时候,我们需要存储所有的变量信息,列入寄存器的值、返回地址等,如果我们不存储的话,当递归返回的时候这些值都已经被下一个方法重写了,所以我们把它压入到栈中,直到方法结束完弹出,把存储的信息再赋值回去。