JavaScript中序表达式转后序表达式并计算结果

简书地址:https://www.jianshu.com/u/489662a091fd

更多算法 持续更新中…

为什么要转换

  • 中序表达式:10*(8-2*1)*2-30
  • 后序表达式: 10821*-230-
  • 中序表达式是给人看的,可以直观的根据优先级计算出结果,但是计算机无法自动识别优先级,因此将带有计算的优先级和括号的中序表达式变成符合某文法的后序(或前序)表达式之后,计算机可以通过从左到右(或从右到左)扫描来计算结果。

中序转后续

模拟栈
class Stack {
   
  constructor() {
   
    this.stack = []
    this.max = 0
    this.opts = {
   
      '+': 1,
      '-': 1,
      '*': 5,
      '/': 5,
      '(': 10,
      ')': 10
    }
  }
  in(char) {
   
    this.stack.push(char)
    this.max = this.opts[this.stack[this.stack.length - 1]]
  }
  out() {
   
    let pop = this.stack.pop()
    this.max = this.opts[this.stack[this.stack.length - 1]]
    return pop
  }
  empty() {
   
    return !this.stack.length
  }
  last() {
   
    return this.stack[this.stack.length - 1]
  }
}

中序转后序的过程
  • 处理表达式:10*(8-2*1)*2-30处理结果为 ["10", "*", "(", "8", "-", "2", "*", "1", ")", "*", "2", "-", "30"]
  • 遍历处理过后的中序表达式
  • 遇到数字直接入栈
  • 遇到’(’ 直接入栈
  • 遇到 ‘)’ 则持续出栈至遇到’('停止
  • 如果 (栈为空 || 当前运算符优先级较高 |
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值