224. Basic Calculator

一开始傻乎乎地在那儿想只有加减法的式子,括号有什么用?其实这种困惑不用纠结呀,你自己随便交一个不考虑括号的代码,肯定会有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 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;
    }
}

你可能感兴趣的:(224. Basic Calculator)