美文网首页
JS 实现 中缀表达式转化成后缀表达式

JS 实现 中缀表达式转化成后缀表达式

作者: pipizh | 来源:发表于2020-11-26 11:18 被阅读0次

中缀表达式 → 后缀表达式 / 逆波兰表达式

数据结构:栈

转化过程:

  1. 创建两个栈s1,s2

    s1用来存储运算符

    s2用来存储中间结果

  2. 遍历表达式:

    1. 当遇到数字时,推入s2

    2. 当遇到运算符时:

      1. 若s1为空,或s1栈顶非运算符即 ( 和 ) ,推入s1

      2. 与s1栈顶运算符比较:

        低于栈顶:推入s1

        等于栈顶:推入s2

        高于栈顶:弹出栈顶,将栈顶推入s2,循环直到该运算符弹入任意栈

    3. 处理 ( 和 )

      1. 如果为 (,推入s1
      2. 如果为 ) ,将s1的栈顶不断的出栈并入栈到s2中,直到s1栈顶为 ( 时停止,并将 ( 出栈丢弃
  3. 重复 2 里面的所有过程,直到表达式遍历结束

  4. 将s2中的栈顶依次出栈并入栈到s1中

  5. 将s1中的栈顶依次出栈并输出,即得到后缀表达式(逆波兰式)

JS 实现:

function infixToSuffix(infix) {
  let symbol = [],
    value = [],
    res = ''
  infix.split('').forEach((item) => {
    switch (true) {
      case /\d/.test(item):
        value.push(item)
        break
      case /[+\-*/]/.test(item):
        while (symbol.length + 1) {
          if (!symbol.length || !/[+\-*/]/.test(symbol[symbol.length - 1])) {
            // 栈顶为空或非运算符
            symbol.push(item) // 弹入栈1
            break
          }
          if (/[*/]/.test(item) && /[+\-]/.test(symbol[symbol.length - 1])) {
            // 比栈顶低
            symbol.push(item) // 弹入栈1
            break
          }
          if (/[+\-]/.test(item) && /[*/]/.test(symbol[symbol.length - 1])) {
            // 比栈顶高
            value.push(symbol.pop()) // 弹出栈顶,栈顶弹入栈2
            continue
          }
          // 等于栈顶
          value.push(item) // 弹入栈2
          break
        }
        break
      case /\(/.test(item):
        symbol.push(item)
        break
      case /\)/.test(item):
        while (symbol.length) {
          let mid = symbol.pop()
          if (mid !== '(') {
            value.push(mid)
          } else break
        }
        break
      default:
    }
  })
  while (value.length) {
    symbol.push(value.pop())
  }
  while (symbol.length) {
    res += symbol.pop()
  }
  return res
}
console.log(infixToSuffix('(3+4)*5-6')) // 34+5*6-
console.log(infixToSuffix('1+2*3+(4*5+6)*7')) // 123*+45*6+7*+

补充:

  • 栈:先进后出

  • 队列:先进先出

  • 堆:树形数据结构

    • 堆中某个节点的值总是不大于或不小于其父节点的值;
    • 堆总是一棵完全二叉树。

相关文章

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

  • 表达式树

    表达式树中缀表达式转换为后缀表达式后缀表达式总结

  • 中缀表达式转后缀表达式并求值

    1.什么是中缀表达式?中缀表达式示例 2.什么是后缀表达式?后缀表达式示例 3.代码

  • 计算器

    使用Java写的一个可以计算+,-,*,/ 的计算器。首先用栈把中缀表达式转化成后缀表达式,再利用栈对后缀表达式求...

  • 前缀,中缀,后缀表达式

    全文转载自:前缀、中缀、后缀表达式(逆波兰表达式),侵删。 前缀表达式,中缀表达式,后缀表达式都是四则运算的表达方...

  • 栈的应用

    中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算...

  • 栈的应用---逆波兰表达式

    中缀表达式 —>> 后缀表达式stack.h main.c

  • JS 实现 中缀表达式转化成后缀表达式

    中缀表达式 → 后缀表达式 / 逆波兰表达式 数据结构:栈 转化过程: 创建两个栈s1,s2s1用来存储运算符s2...

  • 四则运算(JAVA)

    计算过程 1.将四则运算串分割出中缀表达式2.将中缀表达式转换为后缀表达式3.对后缀表达式进行求值得出结果

  • day06-逆波兰表达式的计算器

    目标:完成一个逆波兰表达式的计算器(分为两个步骤)计算后缀表达式:中缀表达式转成后缀表达式: 1.计算后缀表达式:...

网友评论

      本文标题:JS 实现 中缀表达式转化成后缀表达式

      本文链接:https://www.haomeiwen.com/subject/opyaiktx.html