[LeetCode-227基本计算器 II] | 刷题打卡

276 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例1:

输入:s = " 3/2 "
输出:1

解题思路

在进行运算时,由于乘除法的优先级大于加减法,所以每次进行运算的时候,要根据下一个运算符进行判断。所以需要在最前面手动添加一个运算符来辅助我们进行运算。

  1. 可以创建一个栈,对于加减号后的数字,将其直接压入栈中;
  2. 对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。
  3. 具体来说,遍历字符串 s,并用变量preSign记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。
  4. 每次遍历到数字末尾时,根据preSign来决定计算方式
  5. 最后将栈中的所有数字进行累加就得到了我们需要的计算值

解题代码

var calculate = function (s) {
    s = s.trim();
    let stack = new Array();
    let preSign = '+';
    let n = s.length;
    let num = 0;
    for (let i = 0; i < n; i++) {
        if (!isNaN(Number(s[i])) && s[i] !== ' ') {
            num = num * 10 + Number(s[i]);
        }
        if (isNaN(Number(s[i])) || 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);
                    break;
            }
            preSign = s[i];
            num = 0;
        }
    }
    let ans = 0;
    while (stack.length) {
        ans += stack.pop();
    }
    return ans;
};

总结

千里执行,始于足下。