算术表达式通常有三种表示形式:中缀表达式、前缀表达式(波兰式)和后缀表达式(逆波兰式)。分别都是什么?
1. 中缀表达式(Infix Notation)
- 形式:运算符位于两个操作数中间,如
A + B
。 - 特点:
- 直观:符合人类日常书写习惯,易于阅读。
- 需要括号和优先级:依赖运算符优先级(如乘除高于加减)和括号来明确运算顺序。
- 计算复杂:计算机需借助栈或递归下降解析器处理优先级和括号。
示例:
3 + 4
(5 - 2) * 7
A + B * C
2. 前缀表达式(Prefix Notation,波兰式)
- 形式:运算符位于操作数之前,如
+ A B
。 - 特点:
- 无需括号:运算顺序由运算符位置决定。
- 从右向左扫描:计算时需从右向左解析表达式。
- 计算机友好:可通过栈高效计算,常用于编译器或Lisp类语言。
示例:
+ 3 4
→ 等价于3 + 4
* - 5 2 7
→ 等价于(5 - 2) * 7
+ A * B C
→ 等价于A + (B * C)
3. 后缀表达式(Postfix Notation,逆波兰式)
- 形式:运算符位于操作数之后,如
A B +
。 - 特点:
- 无需括号和优先级:运算顺序由运算符位置唯一确定。
- 从左向右扫描:计算时按顺序处理,遇到运算符立即执行。
- 高效计算:栈的天然适配(操作数入栈,遇到运算符弹出计算)。
示例:
3 4 +
→ 等价于3 + 4
5 2 - 7 *
→ 等价于(5 - 2) * 7
A B C * +
→ 等价于A + (B * C)
对比与转换
形式 | 示例 | 转换规则 |
---|---|---|
中缀 → 前缀 | A + B * C → + A * B C | 从右向左扫描,按优先级插入运算符(需调车场算法或递归法)。 |
中缀 → 后缀 | A + B * C → A B C * + | 从左向右扫描,利用栈处理优先级和括号(经典调车场算法)。 |
命名来源
- 前缀表达式:由波兰数学家扬·卢卡西维茨(Jan Łukasiewicz)提出,故称“波兰式”。
- 后缀表达式:为前缀的逆形式,得名“逆波兰式”。
应用场景
- 中缀表达式:人类可读的数学表达、编程语言中的公式。
- 前缀/后缀表达式:编译器中间代码、计算器解析(如逆波兰式计算器)、函数式编程。