LeetCode 224. 基本计算器

题目描述

224. 基本计算器

思路分析

解法一:栈 + 符号累积(推荐)

核心思路

  • 从左到右扫描,数字部分累积成 num
  • 使用 sign 表示当前数字的符号,res 表示当前括号内的结果。
  • 遇到 ( 时,将当前 ressign 入栈,重置进入新子表达式。
  • 遇到 ) 时,先把当前 num 结算到 res,再与栈顶结果合并。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串长度。
  • 空间复杂度:O(n),栈存储括号上下文。
import java.util.*;

class Solution {
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        int res = 0;
        int num = 0;
        int sign = 1;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                num = num * 10 + (c - '0');
            } else if (c == '+') {
                res += sign * num;
                num = 0;
                sign = 1;
            } else if (c == '-') {
                res += sign * num;
                num = 0;
                sign = -1;
            } else if (c == '(') {
                stack.push(res);
                stack.push(sign);
                res = 0;
                sign = 1;
            } else if (c == ')') {
                res += sign * num;
                num = 0;
                res *= stack.pop();
                res += stack.pop();
            }
        }

        res += sign * num;
        return res;
    }
}
func calculate(s string) int {
	stack := make([]int, 0)
	res := 0
	num := 0
	sign := 1

	for i := 0; i < len(s); i++ {
		c := s[i]
		if c >= '0' && c <= '9' {
			num = num*10 + int(c-'0')
			continue
		}
		if c == '+' {
			res += sign * num
			num = 0
			sign = 1
		} else if c == '-' {
			res += sign * num
			num = 0
			sign = -1
		} else if c == '(' {
			stack = append(stack, res)
			stack = append(stack, sign)
			res = 0
			sign = 1
		} else if c == ')' {
			res += sign * num
			num = 0
			sign = stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			prev := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			res = prev + sign*res
		}
	}

	res += sign * num
	return res
}

相似题目

题目 难度 考察点
227. 基本计算器 II 中等 栈、模拟
772. 基本计算器 III 困难 栈、模拟
150. 逆波兰表达式求值 中等
224. 基本计算器 困难 栈、模拟
394. 字符串解码 中等 栈、模拟
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/36902199
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!