栈的应用
括号匹配问题
计算机找对应的匹配的括号,一定是先把左括号存入,然后在找到第一个右括号的时候
会取出最后一次的左括号
这不就后进先出吗
所以可以把找到左括号认为是一个入栈操作,找到右括号是一个出栈操作
然后括号匹配就相当于一个栈操作
几种错误情况
1.扫描左括号和右括号不匹配
左括号和右括号不匹配,一个是小括号,一个是中括号
后面的就都不用看了
不合法
2.进行出栈操作时候,栈空了
到对应右中括号的时候,栈中所有的左括号已经取出,没有对应的右括号
与他匹配,后面也就不用看了
不合法
3.进行完所有出栈操作(右括号完),栈中还有元素(左括号)
算法实现
小结
栈在后缀、前缀求值表达式求值中的应用(含说明)
中值表达式
界限符:就是我们所谓的括号,决定运算的先后顺序
(逆)波兰表达式(前(后)缀)来不用界限符,也能表达运算顺序
一个中缀表达式可能对应很多个后缀表达式或者前缀表达式
中缀转后缀
一定要遵循左优先原则
保证机算和手算结果相同(且12345最后是对应的,比较整齐)
后缀计算
手算
机算
b先出栈是右操作数,a后出栈左操作数
中缀转前缀
遵循有优先原则,运算出来的结果也是比较整齐的
注意是从右往左扫
小结
用栈来实现中缀相关操作(求值和转后缀)
中缀表达式转后缀表达式(机算)
前一个运算符是否可以出栈
全靠
看后一个运算符的优先级
优先级比前面高,不能,再看下一个,如果运算级相同就出栈(只出一个*号)
然后再看栈顶的右一个运算符
重新再上面的那个操作
中缀求值
先把中缀转为后缀然后
然后求后缀就ok了(计算机的处理方式)
+
=
小结
栈在递归中的应用
递归调用的过程,从第一个函数到最后一个函数(判断条件不成立),一个入栈,然后从栈顶开始调用,一个个出栈,这不就是先进后出
就是一个后进先出的过程
适合用递归的问题
1.递归
2.斐波那契数列