Algorithms first

基本计算器 · 交互式算法学习

计算包含 +、-、括号和空格的表达式。

#224 ·

基本计算器

Basic Calculator

测试用例s = "(1+(4+5+2)-3)+(6+8)"
栈 / 队列 / 堆3 个关键状态
步骤 1外层默认符号为 +1。ops=[1]
队首
(
1
+
(
4
+
5
+
2
)
-
3
)
+
(
6
+
8
)
队尾
推荐

符号上下文栈

时间 O(n)空间 O(括号深度)

栈保存外层符号;每个数字乘当前有效符号后直接累加。

1function calculate(s) {2  let ans = 0,3    sign = 1,4    i = 0;5  const ops = [1];6  while (i < s.length) {7    if (s[i] === ' ') {8      i++;9      continue10    }11    if (s[i] === '+') {12      sign = ops.at(-1);13      i++;14    } else if (s[i] === '-') {15      sign = -ops.at(-1);16      i++;17    } else if (s[i] === '(') {18      ops.push(sign);19      i++;20    } else if (s[i] === ')') {21      ops.pop();22      i++;23    } else {24      let n = 0;25      while (i < s.length && /\d/.test(s[i])) n = n * 10 + +s[i++];26      ans += sign * n;27    }28  }29  return ans;30}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public int calculate(String s) {3        Deque<Integer> stk = new ArrayDeque<>();4        int sign = 1;5        int ans = 0;6        int n = s.length();7        for (int i = 0; i < n; ++i) {8            char c = s.charAt(i);9            if (Character.isDigit(c)) {10                int j = i;11                int x = 0;12                while (j < n && Character.isDigit(s.charAt(j))) {13                    x = x * 10 + s.charAt(j) - '0';14                    j++;15                }16                ans += sign * x;17                i = j - 1;18            } else if (c == '+') {19                sign = 1;20            } else if (c == '-') {21                sign = -1;22            } else if (c == '(') {23                stk.push(ans);24                stk.push(sign);25                ans = 0;26                sign = 1;27            } else if (c == ')') {28                ans = stk.pop() * ans + stk.pop();29            }30        }31        return ans;32    }33}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

基本计算器 · 解法对比

计算包含 +、-、括号和空格的表达式。

测试用例
s = "(1+(4+5+2)-3)+(6+8)"
题目分类
解法对比
2
方案 1

递归下降解析

遇到左括号递归计算子表达式,右括号返回。

时间
O(n)
空间
O(括号深度)
方案 2

符号上下文栈

栈保存外层符号;每个数字乘当前有效符号后直接累加。

时间
O(n)
空间
O(括号深度)