[LeetCode] 224. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

Example 1:
Input: “1 + 1”
Output: 2

Example 2:
Input: “ 2-1 + 2 “
Output: 3

Example 3:
Input: “(1+(4+5+2)-3)+(6+8)”
Output: 23

Note:
You may assume that the given expression is always valid.
Do not use the eval built-in library function.

基本计算器。

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/basic-calculator 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

题意是实现一个基本的计算器来计算一个简单的字符串表达式的值。注意这个题是不需要处理乘法和除法的,只需要处理加减法和带括号的情形。

思路是用 stack。按字符逐个遍历 input,注意这道题无需处理不合法的输入,所以会轻松一些。一开始遍历的时候设置一个变量 res 和一个变量 sign 记录最后的结果结果的正负号。注意这道题是会把运算符号以 +1-1 的形式放入 stack 的,弹出的时候加减运算也是是会依赖运算符号的正负情况的。

最后着重讲一下带括号的部分,如果你遇到一个左括号,就需要把之前的 res 和 sign 加入 stack,这里顺序不能错,先加 res 再加 sign,并且把 res 和 sign 都重新设置成 0 和 1,使得他们可以继续用来记录括号内的部分的结果和正负情况。当遇到右括号的时候则开始结算括号内的结果。此时的 res 是记录了括号内的部分的结果,stack.pop() 会先弹出 sign;再弹一次的时候就得到了括号部分之前的 res,再相加就得到最终的结果了。

复杂度

时间O(n)
空间O(n)

代码

Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
int res = 0;
int sign = 1;
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
int num = s.charAt(i) - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
num = num * 10 + s.charAt(i + 1) - '0';
i++;
}
res += num * sign;
} else if (s.charAt(i) == '+') {
sign = 1;
} else if (s.charAt(i) == '-') {
sign = -1;
} else if (s.charAt(i) == '(') {
stack.push(res);
stack.push(sign);
res = 0;
sign = 1;
} else if (s.charAt(i) == ')') {
// 第一次pop的是符号,第二次pop的是再之前的一个数字
res = res * stack.pop() + stack.pop();
}
}
return res;
}
}

相关题目

1
2
3
4
224. Basic Calculator
227. Basic Calculator II
772. Basic Calculator III
1006. Clumsy Factorial

[LeetCode] 224. Basic Calculator
https://shurui91.github.io/posts/1544296577.html
Author
Aaron Liu
Posted on
May 17, 2020
Licensed under