vaakian / vaakian.github.io

some notes
https://vaakian.github.io
3 stars 0 forks source link

表达式计算 #29

Open vaakian opened 2 years ago

vaakian commented 2 years ago

大一那会做的,今天又遇到了,也实现了。 放在这里当一个巩固吧。

const fns = {
    '+': (a, b) => a + b,
    '-': (a, b) => a - b,
    '*': (a, b) => a * b,
    '/': (a, b) => a / b,
}
const isNumber = n => {
    return '0123456789'.includes(n)
}

function calcExpression(exp = '') {
    let [opt, num] = [[], []]
    for (let i = 0; i < exp.length; ++i) {
        let c = exp[i]
        if ('+-*/('.includes(c)) {
            opt.push(c)
        } else if (c === ')') {
            // 开始计算
            let b = num.pop()
            let a = num.pop()
            let o = opt.pop()
            num.push(fns[o](a, b))
            // pop掉(
            opt.pop()
        } else {
            // 截取整个数字
            let j = i;
            while (isNumber(exp[j])) ++j

            let currNum = parseInt(exp.slice(i, j))
            i = j - 1
            if ('*/'.includes(opt[opt.length - 1])) {
                let a = num.pop()
                num.push(fns[opt.pop()](a, currNum))
            } else num.push(currNum)
        }
    }
    while (opt.length) {
        let b = num.pop()
        let a = num.pop()
        let o = opt.pop()
        num.push(fns[o](a, b))
    }
    return num.pop()
}

console.log(calcExpression('3*(2+4)'), 3 * (2 + 4))
console.log(calcExpression('88/(4+3)'), 88 / (4 + 3))