前缀表达式、中缀表达式、后缀表达式转换计算(数据结构)
前缀表达式、中缀表达式和后缀表达式是表达数学运算的三种不同方式。中缀表达式(如A+B)是运算符位于操作数之间的形式,直观易读但需括号处理优先级。前缀表达式(如+AB)将运算符置于所有操作数之前,无需括号,适合计算机从右向左解析。后缀表达式(如AB+)则将运算符放在所有操作数之后,同样无需括号,适合计算机从左向右解析,常用于栈式计算器。这三种表达式分别对应于树的前序、中序和后序遍历,其中前缀和后缀表
一、前缀表达式、中缀表达式、后缀表达式 是什么
(一)前缀表达式(Infix Notation)
-
定义:运算符位于两个操作数之间,是人类最常用的表达式形式。
-
示例:A + B、(3 * 4) + 5
-
特点:直观易读,但需括号处理优先级。
计算机直接解析较复杂(需考虑运算符优先级和括号)。
(二)中缀表达式(Prefix Notation,又称波兰表达式)
-
定义:运算符位于所有操作数之前。
-
示例:+ A B(等价于中缀的 A + B) + * 3 4 5(等价于 (3 * 4) + 5)
-
特点:无需括号,通过运算符顺序和操作数数量即可确定运算顺序。
适合计算机栈操作(从右向左扫描)。
(三)后缀表达式(Postfix Notation,又称逆波兰表达式)
-
定义:运算符位于所有操作数之后。
-
示例:A B +(等价于 A + B) 3 4 * 5 +(等价于 3 * 4 + 5)
-
特点:无需括号,从左向右扫描即可计算(遇到运算符时,其前两个操作数必已就绪)。
计算机处理效率高,常用于栈式计算器(如早期HP计算器)。
(四)转换示例
- 中缀:(A + B) * C
- 前缀: * + A B C
- 后缀: A B + C *
(五)关键区别
| 类型 | 运算符位置 | 括号需求 | 计算方向 | 典型应用场景 |
|---|---|---|---|---|
| 中缀 | 操作数之间 | 需要 | 需优先级规则 | 人类书写 |
| 前缀 | 操作数前 | 不需要 | 从右向左 | Lisp语言、编译器 |
| 后缀 | 操作数后 | 不需要 | 从左向右 | 栈式计算、虚拟机 |
二、如何计算前、中、后缀表达式
前缀表达式、中缀表达式、后缀表达式,是通过树来存储和计算表达式的三种不同方式
以如下公式为例
( a + b − c ) ) ∗ d
通过树来存储该公式,可以表示为

问题就来了,树只是一种抽象的数据结构,它必须要通过某个形式的文本来才能存储和输入
此时,就有了三种表示方法:前缀表达式、中缀表达式、后缀表达式
它们分别相当于树的前序遍历、中序遍历、后序遍历,前中后指的是遍历时运算符的遍历顺序
前序遍历(前缀表达式):运算符 + 左操作数 + 右操作数
中序遍历(中缀表达式):左操作数 + 运算符 + 右操作数
后序遍历(后缀表达式):左操作数 + 右操作数 + 运算符
(一)前缀表达式
运算符 + 左操作数 + 右操作数
上面的公式,先序遍历的结果为
∗ + a − b c d
这种表达方式是没有歧义的,可以直接作为前缀表达式的结果,这种表达方式,符合计算机的处理习惯,程序可以很容易地解析这种表达式
(二)中缀表达式
左操作数 + 运算符 + 右操作数
上面的公式,中序遍历的结果为:
a + b − c ∗ d
显然,这种表达方式是有歧义的,比如ab是一颗子树,cd是一颗子树,最后相减,遍历结果和上面是一样的。所以中缀表达式必须借助括号,才能正确地表达出想要的结果。中缀表达式的表示结果为:
( a + ( b − c ) ) ∗ d
这种表达方式,符合人类的阅读习惯
(三)后缀表达式
左操作数 + 右操作数 + 运算符
上面的公式,后序遍历的结果为:
a b c − + d ∗
这种表达方式,也符合计算机的处理习惯,解析也很简单。相对于前缀表达式来说,后缀表达式的符号读取顺序,和人类阅读习惯是一致的。因此实际计算机程序中,基本都是用后缀表达式来存储公式的,前缀表达式效果次之。对于中缀表达式,我们则可以先将其转为后缀表达式,再进行求值。
三、例题
(选择题) 算术表达式b*(a+c)-d的后缀表达式是( )。
A. ba+cd*- B. bacd+*- C. ba*c+d*- D. bac+*d-
正确答案:D
本题考查后缀式:左操作数 + 右操作数 + 运算符

所以结果为: bac+*d-
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)