# 「力扣」第 224 题:基本计算器
读到符号看栈顶,读到数字看符号(已经看过栈顶的信息了)。
- 强调题意
- 只有数字、加减、括号、空格
- 强调一下「提示」的内容
思路分析
- 主要目的是「去括号」;
- 每个数字最终的符号,由「它前面的符号」以及「它前面的左括号前的符号」共同决定。括号的影响,从左括号开始,到与之配对的右括号结束。
下面我们一点一点拆分解决这个问题:
处理 2 位以及 2 位以上的数字:
处理空格:跳过
第一,如果没有括号,没有空格,如果全是「+」,是不是很简单;
第二,如果没有括号,没有空格,如果全是「+、-」,需要知道之前看到的是「正号、还是负号」,设置变量
sign
;第三,再复杂一点,有括号。看到数字、符号、以及前面的括号,就可以把括号拆掉。有几层括号,以及括号前面的正负号,决定了当前这个数的正负号。
典型例子:
1-(4-5-(1+3-(2-1-(1+8))))-(1+2)
# 方法:栈
class Solution {
public int calculate(String s) {
int len = s.length();
int res = 0;
int sign = 1;
Stack<Integer> stack = new Stack<>();
stack.push(1);
for (int i = 0; i < len; i++) {
if (s.charAt(i) == ' ') {
continue;
} else if (s.charAt(i) == '+') {
sign = stack.peek();
} else if (s.charAt(i) == '-') {
sign = -stack.peek();
} else if (s.charAt(i) == '(') {
stack.push(sign);
} else if (s.charAt(i) == ')') {
stack.pop();
} else {
int num = 0;
while (i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
num = 10 * num + s.charAt(i) - '0';
i++;
}
i--;
res += sign * num;
}
}
return res;
}
}
作者:liweiwei1419 链接:https://suanfa8.com/stack/solutions-1/0224-basic-calculator 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。