一、前缀表达式、中缀表达式、后缀表达式 是什么
(一)前缀表达式(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-