跳转至

前中后缀表达式

方法速览

任务 方法 口诀
是什么 中缀 = 表达式树中序;前缀 = 前序;后缀 = 后序 根左右、左根右、左右根
中缀 → 后缀 选择题:完全括号法;编程:从左往右扫描,运算符比栈顶不高于则先弹 括号搬家,符号右移
中缀 → 前缀 完全括号法后符号左移;编程:从右往左扫描 符号左移
后缀求值 从左往右扫,遇运算符弹出右、左两个数计算压回 左右弹,算完压回
前缀求值 往左扫,遇运算符弹出左、右两个数(顺序相反) 前缀倒着扫

什么是前中后缀表达式

把中缀表达式画成表达式树(运算符是内部结点、操作数是叶子),三种遍历就是三种表示:

表示 树遍历 形态 特点
中缀 中序 a + b 人读的写法,有优先级歧义,需要括号
前缀(波兰式) 前序 + a b 运算符在,无需括号
后缀(逆波兰式) 后序 a b + 运算符在,无需括号

a * (b + c) * d 的表达式树:

1
2
3
4
5
6
7
        *
       / \
      *   d
     / \
    a   +
       / \
      b   c

前序 * * 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*

编程做法(运算符栈,从左往右)

  1. 操作数直接输出;
  2. 运算符:把栈顶优先级 ≥ 它的都弹出输出,再压栈(左括号直接压;右括号弹到左括号为止);
  3. 扫完把栈里剩余全部弹出。

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-bcb-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*+;最后 - dabc*+d-

练习 6 · 中缀转后缀(双减)

题目

a - (b - c) * d 的后缀表达式是( )

  • A. abc-d*-
  • B. abcd--*
  • C. ab-cd*-
  • D. abc-d-*
答案与解析

答案:A

括号里 b-cbc-;乘 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+*;再 * dabc+*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 行栈表),别跳步。