227. 基本计算器 II

106 阅读1分钟

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

输入: s = "3+2*2"
输出: 7

示例 2:

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

示例 3:

输入: s = " 3+5 / 2 "
输出: 5

题解:

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
    const stack = [];
    let curNum = 0, pre = "+";
    // 遍历时最后一位进入stack栈内
    s = s + "+" 
    for (let i = 0; i < s.length; i++) {
        let ca = s[i]
        // 如果为空跳过此次循环
        if (ca == " ") continue;
        // 当前值为 0 ~ 9时 做Number转换  curNum * 10 => 如果当前数不是单数的处理
        if (ca >= "0" && ca <= "9") {
            curNum = curNum * 10 + Number(ca)
        } else {
            // 遇到 + 时 直接入栈
            // 遇到 - 时 当前数 负数入栈
            // 遇到 * 时 栈顶出栈与当前数相乘入栈
            // 遇到 / 时 栈顶出栈与当前数相除 | 0 取整数 入栈
            switch (pre) {
                case "+":
                    stack.push(curNum)
                    break
                case "-":
                    stack.push(-curNum)
                    break
                case "*":
                    stack.push(stack.pop() * curNum)
                    break
                case "/":
                    stack.push((stack.pop() / curNum) | 0)
                    break
            }
            // 初始化curNum
            curNum = 0
            // 存储上一次值
            pre = ca 
        }

    }

    let ans = 0;
    // 循环栈内数据 累加
    while (stack.length) {
        ans += stack.pop();
    }
    return ans;
};

来源:力扣(LeetCode)

链接:leetcode.cn/problems/ba…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。