栈与队列中等1 种解法

#150逆波兰表达式求值

计算有效逆波兰表达式,整数除法向零截断。

#数组##数学

解题主线

01

遇到数字入栈;遇到运算符时先弹出右操作数,再弹出左操作数。

解法 1操作数栈

数字压栈,运算符消费栈顶两个操作数并把结果压回。

时间复杂度

O(n)

空间复杂度

O(n)

150. 逆波兰表达式求值 · 操作数栈
import java.util.ArrayDeque;
import java.util.Deque;

final class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> operands = new ArrayDeque<>();
        for (String token : tokens) {
            if (!isOperator(token)) {
                operands.push(Integer.parseInt(token));
                continue;
            }
            int right = operands.pop();
            int left = operands.pop();
            int value = switch (token) {
                case "+" -> left + right;
                case "-" -> left - right;
                case "*" -> left * right;
                case "/" -> left / right;
                default -> throw new IllegalStateException("Unexpected operator");
            };
            operands.push(value);
        }
        return operands.pop();
    }

    private boolean isOperator(String token) {
        return token.length() == 1 && "+-*/".indexOf(token.charAt(0)) >= 0;
    }
}

数字压栈,运算符消费栈顶两个操作数并把结果压回。

  • 修复减法、除法的左右操作数顺序,并移除会跨调用残留的实例栈。

边界与易错点

  • 减法和除法不可交换:旧实现使用 num1-num2、num1/num2,左右操作数颠倒。
  • 栈必须是方法内局部状态,否则同一实例多次调用可能相互污染。
  • 负数 token 不是减号运算符,应按完整字符串判断。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

medium/Q150_evalRPN.java