后缀表达式计算器用栈实现,先按空格切分token并识别数字或运算符,再左到右扫描:遇数入栈,遇符弹两数按左-右顺序计算后压栈,最终栈顶即结果。

后缀表达式计算器的核心是用栈模拟运算过程,逆波兰表示法(RPN)本身不依赖括号和优先级规则,天然适配栈结构。实现关键在于两个阶段:一是正确解析输入字符串(支持多位数、空格分隔),二是严格按“左到右扫描 + 遇数入栈、遇符取两数计算”执行。
后缀表达式怎么解析输入字符串
输入通常为以空格分隔的字符串,如 "3 4 + 5 * 6 -"。不能直接按字符拆分(否则会把 "10" 拆成 '1' 和 '0'),而要按 token 切分:
- 用 空格 split 得到字符串列表,例如
["3", "4", "+", "5", "*", "6", "-"] - 逐项判断:若匹配
\d+(正则识别整数),转为 int 入栈;否则视为运算符 - 注意支持负数时需额外处理符号前缀,基础版本可先限定非负整数
栈怎么参与计算过程
使用一个数字栈(如 Java 的 Stack<integer></integer> 或 Python 的 list),从左到右遍历 token:
- 遇到操作数(如 3、4、5),直接压栈
- 遇到运算符(如 +、-、*、/),弹出栈顶两个元素:先弹的是右操作数,后弹的是左操作数
- 执行运算(例如减法是
left - right,不是top - next),结果再压栈 - 最终栈中只剩一个数,就是表达式结果
常见易错点和边界处理
实际编码时容易忽略这些细节:
- 除零检查:遇到 '/' 时,需判断右操作数是否为 0
- 栈深度不足:运算符到来时栈中少于 2 个数,说明表达式非法,应抛异常
-
整数除法取整方式:Java 中
5 / 2 = 2,Python3 中5 // 2 = 2,若需向零截断,可用int(a / b) - 多余操作数:扫描完所有 token 后栈中多于 1 个数,说明输入格式错误
一个完整的小例子走一遍
以 "9 3 1 - 3 * + 10 2 / +" 为例:
- 依次入栈 9、3、1 → 栈:
[9, 3, 1] - 遇到 '-':弹 1 和 3 → 计算
3 - 1 = 2→ 入栈 → 栈:[9, 2] - 入 3 → 栈:
[9, 2, 3];遇到 '*':弹 3 和 2 →2 * 3 = 6→ 栈:[9, 6] - 遇到 '+':弹 6 和 9 →
9 + 6 = 15→ 栈:[15] - 入 10、2 → 栈:
[15, 10, 2];遇到 '/':弹 2 和 10 →10 / 2 = 5→ 栈:[15, 5] - 最后 '+':弹 5 和 15 →
15 + 5 = 20→ 结果 20











