227. 基本计算器 II

115 阅读1分钟

227. 基本计算器 II

解题思路

  1. 去除所有的空格
  2. 对于 ‘42’ 连续的数字需要进行保存到 num
  3. stack 栈维护需要进行计算的数字只进行累加操作
  4. 遍历到最后一个时,需要注意进行一次操作符的运算
  5. 最后 ans 计算 stack的累加值即可

代码

/**
 * @param {string} s
 * @return {number}
 */
/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
    // 整理字符串
    s = s.replaceAll(" ", "")

    // stack 装载需要累加的数字栈
    const stack = []
    
    // / 需要取整 parseInt
    let op = '+'

    // 处理连续的字符 ‘42’ 需要乘基数 10
    let num = 0

    const toNum = (n) => Number(n)
    const isNumber = (c) => !Number.isNaN(toNum(c))

    for (let i = 0; i < s.length; i++) {
        // 处理两种情况 数字和 操作符(特殊情况最后一个字符需要进行一次操作)
        const char = s[i]

        if (isNumber(char)) {
            num = num * 10 + toNum(char)
        }

        const isOp = () => !isNumber(char) || i === s.length - 1

        if (isOp()) {
            switch (op) {
                case '+':
                    stack.push(num)
                    break
                case '-':
                    stack.push(-num)
                    break
                case '*':
                    stack.push(stack.pop() * num)
                    break
                case '/':
                    // 需要进行取整操作
                    num = parseInt(stack.pop() / num)
                    stack.push(num)
                    break
            }
            num = 0
            op = char
        }


    }

    let ans = 0
    while (stack.length) {
        ans += stack.pop()
    }

    return ans
};