力扣-基本计算器

203 阅读1分钟

解题思路

解题思路很简单,我们知道加减乘除中,乘法与除法运算优先级要高于加减运算, 那么首先我们需要一个栈空间,对我们的字符串进行遍历,判断当前位置是数字还是运算符号,当遇到加减法时,直接存入栈空间,这里假设我们最后结果只做加法运算,那么遇到减法运算符的情况,将它转位负数存入栈中,遇到乘法或者除法时,将栈顶弹出,做完运算再将它存入栈中,此时我们就需要保存一下当前的运算符类型!直至遍历结束

var calculate = function(s) {
// 去除字符串中的空格
    s = s.trim()
    // 定义栈空间
    let pask = new Array()
    let n = s.length
    let num = 0
    // 假想从第一个值就做加法运算
    let preSign = '+'
    for (let i = 0; i < n; i++) {
        // 不是运算符的情况
        if (!isNaN(Number(s[i])) && s[i] !== ' ') {
               // 使用编码解决没有运算的情况
            num =  num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
        }
        if (isNaN(Number(s[i]))  || i === n - 1) {
            switch (preSign) {
                case "+":
                    pask.push(num)
                    break;
                case "-":
                    pask.push(-num)
                    break;
                case '*':
                    pask.push(pask.pop() * num)
                    break;
                default:
                    pask.push(pask.pop() / num | 0)
                    break;
            }
            preSign = s[i]
            num = 0
        }
    }
    // 每次将栈顶弹出进行相加
    let ans = 0
    while (pask.length) {
        ans += Number(pask.pop())
    }
    return ans
}