一开始傻乎乎地在那儿想只有加减法的式子,括号有什么用?其实这种困惑不用纠结呀,你自己随便交一个不考虑括号的代码,肯定会有test case给你解释什么情况要考虑括号。比如"2-(5-6)"
所以对于括号的处理和对于两位或两位以上数字的处理成为关键。
两位以上的数字可以用while循环读完就好。遇到左括号,我们先往stack里push前面的计算结果res, 再push前面的sign.比如例子里括号前面的res就是2, 括号前面的符号是减号。遇到右括号的时候,我们当前的res就是括号内的计算结果(因为见到左括号是我们重置res和sign),那我们到底是要加到之前的res还是用之前的res减去括号里的结果呢?这时候就要pop出来stack里的东西来看了。第一个pop出来的是符号,所以我们用括号里的结果res乘以符号,再加上之前的结果,就得到完整的结果。
class Solution {
//"2-(5-6)"
public int calculate(String s) {
int res = 0;
int sign = 1;
s = s.replaceAll(" ", "");
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if (c == '('){
stack.push(res);
stack.push(sign);
res = 0;
sign = 1;
} else if (c == ')'){
//"2-(5-6)"
//prevSign = -1
//prevRes = 2
//res = -1;
//res = -1*-1 + 2 = 3
int prevSign = stack.pop();
int prevRes = stack.pop();
res = res*prevSign + prevRes;
} else if (c >= '0' && c <= '9'){
int num = c - '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 (c == '+'){
sign = 1;
} else if (c == '-'){
sign = -1;
}
}
return res;
}
}