408数据结构:中缀转后缀与操作符栈容量——真题精讲

所属章节:数据结构 -> 栈、队列和数组 -> 栈的应用 -> 表达式求值

重点:判断中缀表达式转后缀表达式时,操作符栈中最多同时保存几个运算符


一、这类题到底考什么

中缀表达式:

复制代码
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扫描到指定操作数时判断操作符栈内容题。

相关推荐
谷哥的小弟1 小时前
TypeScript在Vue3中的常见写法
前端·javascript·typescript
人间凡尔赛1 小时前
2026 前端全栈新范式:Server Actions + Edge Runtime,告别传统 API 路由
前端·全栈·next.js
mONESY2 小时前
用 useRef 管理 Worker 线程,让你的页面不再卡顿
javascript
Iruoyaoxh2 小时前
数据结构排序
数据结构
来一碗刘肉面3 小时前
图的基本操作
数据结构
码林鼠4 小时前
2026前端面试题(二)
前端
Mem0rin5 小时前
前缀和:一维与二维
数据结构·算法
鱼子星_5 小时前
【C++】stack和queue的应用及其模拟实现:适配器与容器适配器
数据结构·c++·笔记·stl
满栀5856 小时前
请求拦截、响应拦截、业务错误统一处理
前端·typescript·anti-design-vue