【路飞】栈-基本计算器 II

502 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

题目:基本计算器 II

image.png

分析

处理加减法

  1. 以3+2-1为例,先给第一个数字加一个默认符号+,变成+3+2-1;
  2. 把第一个运算符和数字组合成一对,也就是三对+3,+2,-1,把它们转成数字,然后放到一个栈中;

处理乘除法

  1. 乘除法可以和栈顶的数相结合,然后加入栈;而加减法只能把自己放入栈;

注意

  1. 不止是遇到新的符号会触发入栈,当i走到了算式的尽头(i == s.length - 1),也应该将前面的数字入栈,方便后序计算最终结果。
  2. 为了保证最后得到的是一个数字(i == s.length - 1),s最开始要去除前后空格,s = s.trim();
function calculate(s) {
    s = s.trim();
    const stack = [];
    // 第一个数字加一个默认符号
    let preSign = '+';
    let num = 0;
    const n = s.length;
    for (let i = 0; i < n; ++i) {
      const val = s[i]
        // 如果是数字,则累加
        if (s[i] >= '0') {
            // 处理连续的数字,比如46;
            num = num * 10 + parseInt(s[i]);
        }
        // 如果是符号,则计算之前的数字
        if (val == '+' || val == '-' || val == '/' || val == '*' || i === n - 1) {
            switch (preSign) {
                case '+':
                    stack.push(num);
                    break;
                case '-':
                    stack.push(-num);
                    break;
                case '*':
                    stack.push(stack.pop() * num);
                    break;
                default:
                    stack.push(stack.pop() / num | 0);
            }   
            preSign = s[i];
            num = 0;
        }
    }
    let ans = 0;
    while (stack.length) {
        ans += stack.pop();
    }
    return ans;
};