Loading

227. [栈]基本计算器 II

227. 基本计算器 II

核心要点:优先计算*,/运算,将操作化简到只剩+,-

  • continue跳过空格,当然也可以用String.replace(" ","")做一个预处理;
  • 由于是使用循环逐位读取,要注意保证数字完整,然后再根据运算符决定入栈;
  • 如果是加号'+',说明前面的运算独立于以后的运算,可以将结果暂时放入栈;
  • 如果是减号'-',可以看成-1 * tempNum,然后将-tempNum入栈;
  • 如果是乘号'*'或者除号'/',由于前面的运算独立于此,可以先计算lastNumtempNum积,然后结果入栈。
// 执行用时: 11 ms , 在所有 Java 提交中击败了 87.54% 的用户 
// 内存消耗: 38.7 MB , 在所有 Java 提交中击败了 97.26% 的用户

class Solution {
    public int calculate(String s) {
        Stack<Integer> numStack = new Stack<>();

        char lastOp = '+';
        char[] arr = s.toCharArray();
        for(int i = 0; i < arr.length; i ++){
            if(arr[i] == ' ') continue;

            if(Character.isDigit(arr[i])){
                int tempNum = arr[i] - '0';
                while(++i < arr.length && Character.isDigit(arr[i])){
                    tempNum = tempNum * 10 + (arr[i] - '0');
                } i--;

                if(lastOp == '+') numStack.push(tempNum);
                else if(lastOp == '-') numStack.push(-tempNum);
                else numStack.push(res(lastOp, numStack.pop(), tempNum));
            } else lastOp = arr[i];
        }

        int ans = 0;
        for(int num : numStack) ans += num;
        return ans;
    }
    
    private int res(char op, int a, int b){
        if(op == '*') return a * b;
        else if(op == '/') return a / b;
        else if(op == '+') return a + b; //其实加减运算可以忽略
        else return a - b;
    }
}
posted @ 2020-10-24 11:19  上海井盖王  阅读(103)  评论(0)    收藏  举报