逆波兰表达式(后缀表达式)

什么是逆波兰表达式?

逆波兰表达式(Reverse Polish Notation,简称 RPN),也被称为后缀表达式,是一种数学表达式的书写方式。在逆波兰表达式中,所有的操作符(如加、减、乘、除)都严格跟在它们的操作数之后

这种表达方式是由波兰逻辑学家扬·武卡谢维奇(Jan Łukasiewicz)提出的“波兰表达式”(前缀表达式,操作符在前面)演变而来的,因此得名。

与传统表达式的对比

我们日常生活中最习惯使用的数学书写方式叫作中缀表达式(操作符在数字中间)。

  • 中缀表达式3 + 4
  • 逆波兰表达式3 4 +

当中缀表达式变得复杂时,我们必须依赖括号运算优先级(先乘除后加减)来决定计算顺序。而逆波兰表达式的一大特点就是完全不需要括号,它的运算顺序严格按照从左到右的位置来决定。

稍微复杂一点的对比:

  • 中缀表达式:5 + ((1 + 2) * 4) - 3
  • 逆波兰表达式:5 1 2 + 4 * + 3 -

计算机如何计算逆波兰表达式?

逆波兰表达式之所以在计算机科学中非常重要,是因为它完美契合了栈(Stack)这种“后进先出”的数据结构,让计算机处理起来极其高效。其计算规则如下:

  1. 从左到右依次扫描表达式中的每一项。
  2. 如果遇到数字,就将其直接压入栈中。
  3. 如果遇到操作符,就从栈顶弹出两个数字,用这个操作符对它们进行计算(注意:先弹出的数字在操作符右边,后弹出的在左边),然后将得出的结果再次压入栈中。
  4. 一直重复上述步骤,直到整个表达式扫描完毕。此时栈里剩下的唯一一个数字,就是最终结果。

3 4 2 \* + 为例的计算步骤:

  1. 读到 3:入栈。当前栈:[3]
  2. 读到 4:入栈。当前栈:[3, 4]
  3. 读到 2:入栈。当前栈:[3, 4, 2]
  4. 读到 *:弹出栈顶的 24,计算 4 * 2 = 8,将 8 入栈。当前栈:[3, 8]
  5. 读到 +:弹出栈顶的 83,计算 3 + 8 = 11,将 11 入栈。当前栈:[11]
  6. 扫描结束,弹出最终结果 11

逆波兰表达式的优势

  • 消除歧义,无需括号:无论多么复杂的公式,都不需要括号来改变优先级。
  • 解析极其迅速:计算机只需从左到右扫描一遍(\(O(N)\) 时间复杂度)即可得出结果,不需要像中缀表达式那样构建复杂的语法树或反复检查优先级。
posted @ 2026-05-23 16:47  光風霽月  阅读(33)  评论(0)    收藏  举报