前中后缀表达式¶
方法速览¶
| 任务 | 方法 | 口诀 |
|---|---|---|
| 是什么 | 中缀 = 表达式树中序;前缀 = 前序;后缀 = 后序 | 根左右、左根右、左右根 |
| 中缀 → 后缀 | 选择题:完全括号法;编程:从左往右扫描,运算符比栈顶不高于则先弹 | 括号搬家,符号右移 |
| 中缀 → 前缀 | 完全括号法后符号左移;编程:从右往左扫描 | 符号左移 |
| 后缀求值 | 从左往右扫,遇运算符弹出右、左两个数计算压回 | 左右弹,算完压回 |
| 前缀求值 | 从右往左扫,遇运算符弹出左、右两个数(顺序相反) | 前缀倒着扫 |
什么是前中后缀表达式¶
把中缀表达式画成表达式树(运算符是内部结点、操作数是叶子),三种遍历就是三种表示:
| 表示 | 树遍历 | 形态 | 特点 |
|---|---|---|---|
| 中缀 | 中序 | a + b |
人读的写法,有优先级歧义,需要括号 |
| 前缀(波兰式) | 前序 | + a b |
运算符在前,无需括号 |
| 后缀(逆波兰式) | 后序 | a b + |
运算符在后,无需括号 |
例:a * (b + c) * d 的表达式树:
前序 * * a + b c d(前缀)、中序 a * b + c * d(要靠括号才不歧义)、后序 a b c + * d *(后缀)——三种表示是同一棵树的三种读法。
中缀转后缀¶
选择题做法(完全括号法):按优先级给中缀补全括号,再把每个运算符移到它那对括号的右边,最后去掉所有括号。
例:a * (b + c) * d:
| 步骤 | 结果 |
|---|---|
| 补全括号 | ( ( a * (b + c) ) * d ) |
| 符号右移 | ((a (b c +) *) d *) |
| 去括号 | a b c + * d * → abc+*d* |
编程做法(运算符栈,从左往右):
- 操作数直接输出;
- 运算符:把栈顶优先级 ≥ 它的都弹出输出,再压栈(左括号直接压;右括号弹到左括号为止);
- 扫完把栈里剩余全部弹出。
例:a + b * c - d:输出 a;+ 入栈;输出 b;* 优先级高于 + 入栈;输出 c;- 不高于 *、+ → 弹出 *、+ 再压 -;输出 d;最后弹 - → abc*+d-。
中缀转前缀¶
完全括号法:补全括号后,把每个运算符移到它那对括号的左边,去括号。
例:a + (b - c) * d:补全 (a + ((b - c) * d));符号左移 + a * - b c d → +a*-bcd。
编程做法:把中缀从右往左扫描(左右括号角色互换、弹栈条件改为“严格大于”),得到的序列再整体反转。
前缀求值¶
从右往左扫,遇操作数压栈;遇运算符弹出两个数(先弹的是左操作数),计算后压回。
例:* 5 + 3 4:从右往左压 4、3;遇 +:弹 3、4 → \(3+4=7\) 压回;压 5;遇 *:弹 5、7 → \(5\times7=35\)。
后缀求值¶
从左往右扫,遇操作数压栈;遇运算符弹出两个数(先弹的是右操作数),计算后压回。
例(2023 真题):6 2 3 + - 3 8 2 / + * 2 ^ 3 + 完整栈表:
| 读到 | 动作 | 栈(底→顶) |
|---|---|---|
| 6 2 3 | 压栈 | 6 2 3 |
+ |
\(2+3=5\) | 6 5 |
- |
\(6-5=1\) | 1 |
| 3 8 2 | 压栈 | 1 3 8 2 |
/ |
\(8/2=4\) | 1 3 4 |
+ |
\(3+4=7\) | 1 7 |
* |
\(1\times7=7\) | 7 |
| 2 | 压栈 | 7 2 |
^ |
\(7^2=49\) | 49 |
| 3 | 压栈 | 49 3 |
+ |
\(49+3=52\) | 52 |
对应中缀:\(((6-(2+3))\times(3+8/2))^2+3 = 52\)。
前/后缀转中缀¶
- 后缀 → 中缀:从左往右扫,每个运算符把它前面的两个“已成形表达式”用括号接起来:
a b c + *→ 先b+c,再a*(b+c); - 前缀 → 中缀:从右往左扫,每个运算符接它右边(后成形的)两个表达式:
+ a * - b c d→-bc得b-c,*接a与(b-c)得a*(b-c),+接a与之得a+(b-c)*d。
练习题目¶
练习 1 · 概念¶
题目
后缀表达式又称逆波兰式,它是表达式树的( )遍历。
- A. 前序
- B. 中序
- C. 后序
- D. 层序
答案与解析
答案:C
后缀 = 运算符在两个操作数之后 = 根在左右子树之后访问 = 后序。
练习 2 · 括号的去处¶
题目
前缀和后缀表达式的共同优点是( )
- A. 更短
- B. 运算更快
- C. 不需要括号也能唯一确定运算顺序
- D. 人更容易读
答案与解析
答案:C
运算符与操作数的相对位置已编码了顺序;只有中缀有优先级歧义、要靠括号。
练习 3 · 中缀转后缀(基础)¶
题目
a + b * c 的后缀表达式是( )
- A.
abc+* - B.
abc*+ - C.
ab+c* - D.
+abc
答案与解析
答案:B
* 优先:先 bc*,再 a + (bc*) → abc*+。
干扰项思路:A 是 (a+b)*c 的后缀(先算加)。
练习 4 · 中缀转后缀(含括号)¶
题目
(a + b) * c 的后缀表达式是( )
- A.
abc*+ - B.
abc+* - C.
ab+c* - D.
*abc
答案与解析
答案:C
括号强制先加:ab+,再乘 c → ab+c*——与上一题对比:括号改变后缀。
练习 5 · 中缀转后缀(两级混合)¶
题目
a + b * c - d 的后缀表达式是( )
- A.
abcd-*+ - B.
ab+c*d- - C.
abc+d*- - D.
abc*+d-
答案与解析
答案:D
b*c 先行得 bc*;a + 得 abc*+;最后 - d → abc*+d-。
练习 6 · 中缀转后缀(双减)¶
题目
a - (b - c) * d 的后缀表达式是( )
- A.
abc-d*- - B.
abcd--* - C.
ab-cd*- - D.
abc-d-*
答案与解析
答案:A
括号里 b-c 得 bc-;乘 d 得 bc-d*;a 减之 → abc-d*-。
干扰项思路:B 把两层减法当成连续运算,丢了乘法的优先位置。
练习 7 · 完全括号法步骤¶
题目
用完全括号法转 a * (b + c) * d,第一步是( )
- A. 去掉所有括号
- B. 按优先级补全括号:
((a * (b + c)) * d) - C. 把 * 移到最前
- D. 反转整个表达式
答案与解析
答案:B
先补全、再移符号、最后去括号——顺序不能乱。
练习 8 · 中缀转前缀(基础)¶
题目
a + b 的前缀表达式是( )
- A.
ab+ - B.
+ab - C.
a+b - D.
++ab
答案与解析
答案:B
前缀:运算符在两个操作数前。
练习 9 · 中缀转前缀(含优先级)¶
题目
a + b * c 的前缀表达式是( )
- A.
+a*bc - B.
*+abc - C.
+abc* - D.
a+*bc
答案与解析
答案:A
先 *bc,再 + 顶前:+a*bc。
练习 10 · 中缀转前缀(含括号)¶
题目
(a + b) * (c - d) 的前缀表达式是( )
- A.
*+ab-cd - B.
+*ab-cd - C.
*ab+cd- - D.
ab+cd-*
答案与解析
答案:A
两括号各得 +ab、-cd;外层 * 顶前 → *+ab-cd。
练习 11 · 后缀求值(两数)¶
题目
后缀表达式 2 3 + 的值是( )
- A. \(1\)
- B. \(6\)
- C. \(5\)
- D. \(23\)
答案与解析
答案:C
压 2、压 3,遇 + 弹出计算 \(2+3=5\)。
练习 12 · 后缀求值(乘除)¶
题目
后缀表达式 2 3 + 5 * 的值是( )
- A. \(10\)
- B. \(30\)
- C. \(16\)
- D. \(25\)
答案与解析
答案:D
先 \(2+3=5\),再 \(5\times5=25\)——对应中缀 \((2+3)\times5\)。
练习 13 · 后缀求值(除法)¶
题目
后缀表达式 6 2 / 3 + 的值是( )
- A. \(4\)
- B. \(5\)
- C. \(6\)
- D. \(2\)
答案与解析
答案:C
\(6/2=3\),\(3+3=6\)——先弹的是右操作数:\(6 \div 2\) 而不是 \(2 \div 6\)。
练习 14 · 后缀求值(复合)¶
题目
后缀表达式 5 3 + 8 2 - * 的值是( )
- A. \(56\)
- B. \(40\)
- C. \(48\)
- D. \(28\)
答案与解析
答案:C
\(5+3=8\)、\(8-2=6\)、\(8\times6=48\)。
练习 15 · 前缀求值(基础)¶
题目
前缀表达式 - 7 3 的值是( )
- A. \(-4\)
- B. \(10\)
- C. \(21\)
- D. \(4\)
答案与解析
答案:D
\(7-3=4\)——前缀从右往左扫,先弹的是左操作数,7 在前。
练习 16 · 前缀求值(复合)¶
题目
前缀表达式 * 5 + 3 4 的值是( )
- A. \(32\)
- B. \(35\)
- C. \(23\)
- D. \(19\)
答案与解析
答案:B
从右往左:压 4、3;+ → \(3+4=7\);压 5;* → \(5\times7=35\)。
练习 17 · 前缀求值(嵌套)¶
题目
前缀表达式 + * 2 3 4 的值是( )
- A. \(14\)
- B. \(24\)
- C. \(9\)
- D. \(10\)
答案与解析
答案:D
\(2\times3=6\),\(6+4=10\)——前缀 + * 2 3 4 对应 \(2\times3+4\)。
练习 18 · 前缀求值(幂)¶
题目
前缀表达式 ^ 2 + 1 3 的值是( )
- A. \(10\)
- B. \(8\)
- C. \(16\)
- D. \(5\)
答案与解析
答案:C
\(1+3=4\),\(2^4=16\)。
练习 19 · 后缀转中缀¶
题目
后缀表达式 a b c + * 对应的中缀是( )
- A.
a * (b + c) - B.
(a + b) * c - C.
a + b * c - D.
(a * b) + c
答案与解析
答案:A
从左往右:bc+ 成形为 (b+c);* 把 a 和它相乘。
练习 20 · 后缀转中缀(连续)¶
题目
后缀表达式 a b + c * 对应的中缀是( )
- A.
a * (b + c) - B.
(a + b) * c - C.
a + b * c - D.
c * a + b
答案与解析
答案:B
ab+ 得 (a+b);* 接 c——读后缀时成形的顺序就是运算顺序。
练习 21 · 前缀转中缀¶
题目
前缀表达式 + a * - b c d 对应的中缀是( )
- A.
a + (b - c) * d - B.
(a + b) * (c - d) - C.
a + b - c * d - D.
(a + b * c) - d
答案与解析
答案:A
从右往左成形:- b c → (b-c);* 接 a 与 (b-c);+ 再接 a——与 2022 真题同一式子。
练习 22 · 长度公式¶
题目
n 个操作数的后缀表达式(每个运算符都是双目)共( )个符号。
- A. \(2n\)
- B. \(n - 1\)
- C. \(n + 1\)
- D. \(2n - 1\)
答案与解析
答案:D
双目运算树:n 片叶、\(n-1\) 个内部结点(运算符),共 \(2n-1\) 个符号。n=4 → 7。
练习 23 · 操作数个数¶
题目
后缀表达式 a b c d + * - 中操作数与运算符个数分别是( )
- A. \(2\) 和 \(5\)
- B. \(3\) 和 \(4\)
- C. \(4\) 和 \(4\)
- D. \(4\) 和 \(3\)
答案与解析
答案:D
4 个操作数、3 个双目运算符(恒差 1);对应中缀 \(a - (b \times (c+d))\)。
练习 24 · 扫描方向¶
题目
后缀与前缀求值的扫描方向分别是( )
- A. 都从左往右
- B. 后缀从左往右,前缀从右往左
- C. 后缀从右往左,前缀从左往右
- D. 都从右往左
答案与解析
答案:B
前缀的运算符在操作数前,倒着扫才能先凑齐操作数。
练习 25 · 弹栈顺序¶
题目
后缀求值遇运算符时,弹出两个数 x(先弹)、y(后弹),应计算( )
- A. \(x \ op\ y\)
- B. \(y\ op\ x\)
- C. 任意
- D. 取较大者先
答案与解析
答案:B
后压的是左操作数 y:算 \(y\ op\ x\)——减法、除法、幂时顺序错了结果就错。
练习 26 · 中缀转后缀(真题变式)¶
题目
a * (b + c) * d 的后缀表达式是( )
- A.
abc+*d* - B.
abcd*+* - C.
abc+d** - D.
*a*+bcd
答案与解析
答案:A
bc+ 得 (b+c);a * 之得 abc+*;再 * d → abc+*d*。
历年真题¶
2021 年 · 第 9 题¶
题目
表达式 a*(b+c)*d 的后缀表达式为( ),其中 * 和 + 是运算符。
- A.
**a+bcd - B.
abc+*d* - C.
abc+d** - D.
*a*+bcd
答案与解析
答案:B
补全括号 ((a*(b+c))*d),符号逐个右移去括号 → abc+*d*。C 把两个 * 都堆在末尾(丢了中间顺序);A/D 是前缀形。
2022 年 · 第 6 题¶
题目
对表达式 a+(b-c)*d 的前缀表达式为( ),其中 +、-、* 是运算符。
- A.
*+a-bcd - B.
+a*-bcd - C.
abc-d*+ - D.
abc-+d
答案与解析
答案:B
补全 (a+((b-c)*d)),符号逐个左移:+ a * - b c d → +a*-bcd。C 是后缀;A 把 * 错顶到最前。
2023 年 · 第 8 题¶
题目
后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )。
- A. \(((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3\)
- B. \(6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3\)
- C. \((6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3\)
- D. \(6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3\)
答案与解析
答案:A
完整栈表见“后缀求值”一节:逐层成形 \(6-(2+3)\)、\(3+8/2\)、两者相乘、平方、加 3,即 A。验算 A 的值 \(= (1\times7)^2+3 = 52\) 与后缀求值一致。
易错小结¶
- 前中后缀 = 表达式树的前中后序;前缀/后缀无需括号,中缀有歧义;
- 完全括号法口诀:后缀符号右移、前缀符号左移;
- 栈法方向:中→后缀从左扫(弹优先级 ≥ 当前的);中→前缀从右扫再反转;
- 后缀求值从左扫、前缀从右扫;后缀先弹的是右操作数(\(y\ op\ x\)),前缀先弹的是左操作数——减除幂的顺序陷阱;
- n 个操作数对应 \(n-1\) 个双目运算符、总长 \(2n-1\);
- 求值题列表格逐行走(2023 真题 11 行栈表),别跳步。