通过前一篇如何计算【3 + 12 * 2 - 2^2】?中缀表达式转后缀表达式,已经实现了中缀表达式转成后缀表达式,接下来我们只要把后缀表达式求值,即可计算出 3 + 12 * 2 - 2^2 的结果。
思路
- 创建一个空栈。
- 从左到右扫描后缀表达式。
- 如果当前字符是数字,将其转换为数字并压入栈中。
- 如果当前字符是操作符(+、-、*、/、^),则从栈中弹出两个元素,对它们执行相应的操作,然后将结果压回栈中。
- 重复步骤 2-4,直到扫描完整个后缀表达式。
- 此时,栈中应该只剩下一个元素,这就是表达式的结果。
代码实现
基于leetcode的150. 逆波兰表达式求值实现的代码。
function evalRPN(tokens) {
if (!tokens) return 0
let arr = []
tokens.forEach(ele => {
if (!isNaN(ele)) {
arr.push(ele)
} else {
let y = Number(arr.pop())
let x = Number(arr.pop())
let result = 0
if (ele === '+') {
result = x + y
}
if (ele === '-') {
result = x - y
}
if (ele === '*') {
result = x * y
}
if (ele === '/') {
result = parseInt(x / y)
}
if (ele === '^') {
result = Math.pow(x, y)
}
arr.push(result)
// console.log(x, y, arr)
}
})
return arr[0]
}
写在最后
留给大家一个思考问题:为什么要把中缀表达式先转成后缀表达式再进行求值?