所属章节:数据结构 -> 栈、队列和数组 -> 栈的应用 -> 表达式求值
重点:判断中缀表达式转后缀表达式时,操作符栈中最多同时保存几个运算符。
一、这类题到底考什么
中缀表达式:
a+b*c
运算符写在两个操作数中间。
后缀表达式:
abc*+
运算符写在操作数后面。
中缀转后缀时,操作数通常可以直接输出,但有些运算符暂时不能确定执行顺序,所以要先放进一个:
操作符栈
因此,这类题问"栈至少需要几个存储单元",本质就是:
找整个转换过程中
操作符栈的最大深度
二、只记4条入栈出栈规则
从左到右扫描中缀表达式。
1. 遇到操作数
直接输出
操作符栈不变
2. 遇到左括号 (
直接入栈
左括号相当于一个"隔离墙"。
3. 遇到右括号 )
不断弹出操作符,直到遇到左括号:
弹出运算符
删除左括号
左右括号本身不进入后缀表达式。
4. 遇到普通运算符
假设当前扫描到运算符 op。
若栈顶运算符优先级:
>= 当前运算符
则先将栈顶运算符弹出。
然后再把当前运算符压栈。
常见优先级:
* / > + -
三、考试最快做法
如果题目只问:
操作符栈最大需要多大?
没有必要完整写出后缀表达式。
只需要:
从左向右扫描
记录操作符栈
找最大栈深
建议统一写:
栈底 -> 栈顶
避免自己看反。
四、2012年408真题
题目给出中缀表达式:
a+b-a*((c+d)/e-f)+g
在转换为后缀表达式的过程中,用栈保存暂时还不能确定运算次序的操作符。栈初始为空,问操作符栈中同时保存的操作符最大个数。
选项:
A. 5
B. 7
C. 8
D. 11
五、真题解题过程
我们只跟踪操作符栈,不需要完整写后缀表达式。
开始:
[]
扫描到第一个 +:
[+]
继续扫描 b,栈不变。
扫描到 - 时,因为栈顶 + 与 - 优先级相同,所以先将 + 弹出,再把 - 入栈:
[-]
扫描到 a 后栈不变。
扫描到 *:
[-, *]
接下来连续遇到两个左括号:
[-, *, (]
[-, *, (, (]
扫描到 c 后栈不变。
扫描到括号内的 +:
[-, *, (, (, +]
此时操作符栈中一共有:
5个元素
这是目前最大值。
接着扫描 d 和右括号,括号内的 + 和左括号会出栈,栈深下降。
后面虽然还有 /、-、+ 等运算符,但栈深都不会再次超过5。
因此:
最大栈深 = 5
答案:
A
六、为什么最容易在这里达到最大值
关键片段是:
-a*((c+d)
此时栈中暂时不能确定运算次序的符号依次是:
-
*
(
(
+
也就是:
5个
所以考试时看到:
连续乘除
+
嵌套括号
+
括号里的运算符
就要特别注意,这通常是操作符栈最深的位置。
七、2014年408真题
题目给出:
a/b+(c*d-e*f)/g
将其转换成后缀表达式。当扫描到操作数 f 时,问操作符栈中的元素依次是什么。
八、真题解题过程
从左向右扫描。
扫描:
a / b
/ 先入栈:
[/]
当继续扫描到 + 时,因为 / 的优先级高于 +,所以 / 先出栈,再把 + 入栈:
[+]
扫描左括号:
[+, (]
扫描 c*d 时,* 暂时入栈:
[+, (, *]
随后遇到 -,因为 * 优先级高,所以 * 出栈,- 入栈:
[+, (, -]
继续扫描 e*f,扫描到 * 后:
[+, (, -, *]
然后扫描到操作数 f,操作数不会改变操作符栈。
所以此时栈中从栈底到栈顶依次为:
+ ( - *
这类题的关键是:
操作数不会入操作符栈
遇到低优先级运算符时,高优先级运算符可能提前出栈
九、这类题最常见的错误
1. 所有运算符都只入不出
错误。
例如:
a+b-
扫描到 - 时,前面的 + 已经可以确定运算次序,所以要先出栈。
2. 括号也直接输出
错误。
括号只负责控制运算次序:
左括号入栈
右括号触发弹栈
括号本身不输出
3. 只看括号层数
错误。
栈中不只有括号,还有:
+ - * /
所以:
最大栈深 != 最大括号嵌套层数
2012真题里虽然只有两层括号,但最大栈深是5。
4. 把操作数也算进操作符栈
错误。
题目如果明确说:
操作符栈
那么:
a、b、c、d...
都不算。
十、考场固定模板
看到:
中缀表达式转后缀
+
操作符栈
+
问最大容量/某时刻栈内容
直接做:
1. 从左向右扫描
2. 操作数不管
3. 左括号直接压栈
4. 右括号弹到左括号
5. 当前运算符优先级不高于栈顶时,先弹栈
6. 每一步记录当前栈深
7. 取最大值
十一、10秒速记
操作数直接输出;
左括号直接入栈;
右括号弹到左括号;
低优先级来到,高优先级先出去;
要求容量,就找操作符栈最大深度。
回去复习的位置
数据结构
-> 栈、队列和数组
-> 栈
-> 栈的应用
-> 中缀表达式转后缀表达式
-> 表达式求值
这部分建议重点练两种题:
1. 问某时刻操作符栈里有什么
2. 问整个转换过程最大栈深是多少
真题:2012年408中缀转后缀操作符栈最大深度题;2014年408扫描到指定操作数时判断操作符栈内容题。
