栈的应用
1. 栈在表达式求值中的应用
34+13*9+44-12/3
编译器就是通过两个栈来实现的。其中一个保存操作数的栈,另一个保存运算符的栈。我们从左向右遍历表
达式,当遇到数字,我们直接压入操作数的栈;当遇到运算符,就与运算符的栈顶元素已经比较。
如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算栈顶元素的优先级低或者相同,从运算符
栈中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较
复制代码

2. 栈在括号匹配中的应用
我们同样简化一下背景。我们假设表达式中只包含三种括号,圆括号 ()、方括号[]和花括号{},
并且它们可以任意嵌套。比如,{[] ()[{}]}或[{()}([])]等都为合法格式,而{[}()]或
[({)]为不合法的格式。那我现在给你一个包含三种括号的表达式字符串,如何检查它是否合法呢?
这里也可以用栈来解决。我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,
则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比如“(”跟“)”匹配,
“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不能配对的右括
号,或者栈中没有数据,则说明为非法格式。当所有的括号都扫描完成之后,如果栈为空,则说明字符串为
合法格式;否则,说明有未匹配的左括号,为非法格式。
复制代码
3.如何实现浏览器的前进和后退?
我们使用两个栈,X 和 Y,我们把首次浏览的页面依次压入栈 X,当点击后退按钮时,
再依次从栈 X 中出栈,并将出栈的数据依次放入栈 Y。当我们点击前进按钮时,
我们依次从栈 Y 中取出数据,放入栈 X 中。当栈 X 中没有数据时,
那就说明没有页面可以继续后退浏览了。当栈 Y 中没有数据,
那就说明没有页面可以点击前进按钮浏览了。
复制代码