如何计算【3 + 12 * 2 - 2^2】?后缀表达式求值

79 阅读1分钟

通过前一篇如何计算【3 + 12 * 2 - 2^2】?中缀表达式转后缀表达式,已经实现了中缀表达式转成后缀表达式,接下来我们只要把后缀表达式求值,即可计算出 3 + 12 * 2 - 2^2 的结果。

思路

  1. 创建一个空栈。
  2. 从左到右扫描后缀表达式。
  3. 如果当前字符是数字,将其转换为数字并压入栈中。
  4. 如果当前字符是操作符(+、-、*、/、^),则从栈中弹出两个元素,对它们执行相应的操作,然后将结果压回栈中。
  5. 重复步骤 2-4,直到扫描完整个后缀表达式。
  6. 此时,栈中应该只剩下一个元素,这就是表达式的结果。

代码实现

基于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]
}

写在最后

留给大家一个思考问题:为什么要把中缀表达式先转成后缀表达式再进行求值?