逆波兰表达式(后缀表达式)
什么是逆波兰表达式?
逆波兰表达式(Reverse Polish Notation,简称 RPN),也被称为后缀表达式,是一种数学表达式的书写方式。在逆波兰表达式中,所有的操作符(如加、减、乘、除)都严格跟在它们的操作数之后。
这种表达方式是由波兰逻辑学家扬·武卡谢维奇(Jan Łukasiewicz)提出的“波兰表达式”(前缀表达式,操作符在前面)演变而来的,因此得名。
与传统表达式的对比
我们日常生活中最习惯使用的数学书写方式叫作中缀表达式(操作符在数字中间)。
- 中缀表达式:
3 + 4 - 逆波兰表达式:
3 4 +
当中缀表达式变得复杂时,我们必须依赖括号和运算优先级(先乘除后加减)来决定计算顺序。而逆波兰表达式的一大特点就是完全不需要括号,它的运算顺序严格按照从左到右的位置来决定。
稍微复杂一点的对比:
- 中缀表达式:
5 + ((1 + 2) * 4) - 3 - 逆波兰表达式:
5 1 2 + 4 * + 3 -
计算机如何计算逆波兰表达式?
逆波兰表达式之所以在计算机科学中非常重要,是因为它完美契合了栈(Stack)这种“后进先出”的数据结构,让计算机处理起来极其高效。其计算规则如下:
- 从左到右依次扫描表达式中的每一项。
- 如果遇到数字,就将其直接压入栈中。
- 如果遇到操作符,就从栈顶弹出两个数字,用这个操作符对它们进行计算(注意:先弹出的数字在操作符右边,后弹出的在左边),然后将得出的结果再次压入栈中。
- 一直重复上述步骤,直到整个表达式扫描完毕。此时栈里剩下的唯一一个数字,就是最终结果。
以 3 4 2 \* + 为例的计算步骤:
- 读到
3:入栈。当前栈:[3] - 读到
4:入栈。当前栈:[3, 4] - 读到
2:入栈。当前栈:[3, 4, 2] - 读到
*:弹出栈顶的2和4,计算4 * 2 = 8,将8入栈。当前栈:[3, 8] - 读到
+:弹出栈顶的8和3,计算3 + 8 = 11,将11入栈。当前栈:[11] - 扫描结束,弹出最终结果
11。
逆波兰表达式的优势
- 消除歧义,无需括号:无论多么复杂的公式,都不需要括号来改变优先级。
- 解析极其迅速:计算机只需从左到右扫描一遍(\(O(N)\) 时间复杂度)即可得出结果,不需要像中缀表达式那样构建复杂的语法树或反复检查优先级。

浙公网安备 33010602011771号