LeetCode LCR 036. 逆波兰表达式求值

题目描述

LCR 036. 逆波兰表达式求值

思路分析

解法一:栈模拟(推荐)

核心思路

  • 遇到数字入栈,遇到运算符弹出两个数计算后再入栈。
  • 注意减法与除法顺序:先弹出的为右操作数。

复杂度分析

  • 时间复杂度:O(n),其中 n 表示 tokens 长度。
  • 空间复杂度:O(n),使用栈保存数字。
// 栈模拟逆波兰表达式
class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> stack = new ArrayDeque<>();

        for (String token : tokens) {
            switch (token) {
                case "+": {
                    int b = stack.pop();
                    int a = stack.pop();
                    stack.push(a + b);
                    break;
                }
                case "-": {
                    int b = stack.pop();
                    int a = stack.pop();
                    stack.push(a - b);
                    break;
                }
                case "*": {
                    int b = stack.pop();
                    int a = stack.pop();
                    stack.push(a * b);
                    break;
                }
                case "/": {
                    int b = stack.pop();
                    int a = stack.pop();
                    stack.push(a / b);
                    break;
                }
                default:
                    stack.push(Integer.parseInt(token));
            }
        }

        return stack.pop();
    }
}
// 栈模拟逆波兰表达式
func evalRPN(tokens []string) int {
	stack := make([]int, 0, len(tokens))

	for _, token := range tokens {
		switch token {
		case "+", "-", "*", "/":
			b := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			a := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			var res int
			switch token {
			case "+":
				res = a + b
			case "-":
				res = a - b
			case "*":
				res = a * b
			case "/":
				res = a / b
			}
			stack = append(stack, res)
		default:
			val, _ := strconv.Atoi(token)
			stack = append(stack, val)
		}
	}

	return stack[0]
}

相似题目

题目 难度 考察点
224. 基本计算器 困难
227. 基本计算器 II 中等
772. 基本计算器 III 困难
20. 有效的括号 简单
71. 简化路径 中等
155. 最小栈 简单
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/42754912
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!