中缀表达式与后缀表达式之间的互转及求值

  • 中缀表达式:常见的运算表达式,如(3+4)×5-6
  • 前缀表达式又称波兰式:运算符位于操作数之前,比如:- × + 3 4 5 6
  • 后缀表达式又称逆波兰表达式:与前缀表达式相似,只是运算符位于操作数之后,如:3 4 + 5 × 6 -

中缀表达式转后缀表达式

  • 从左到右扫描表达式
  • 若遇到数字,输出
  • 若遇到运算符时:
    • 遇到“(”,直接压入栈,
    • 遇到运算符,和栈顶的运算符比较优先级,
      • 优先级高的话直接压入栈,
      • 优先级低的话,输出栈顶元素且栈顶元素出栈,然后继续和新的栈顶元素比较优先级,直至它的优先级高于栈顶元素时,把它压入栈
      • 若平级,就按先栈里的优先级高来算
    • 遇到“)”,依次弹出栈顶元素并输出,直至遇到“(”后,左括号出栈
  • 扫描结束后若栈中不为空依次弹出
    例: 2*(9+6/3-5)+4
    从左到右开始扫描
  1. 扫描到2,输出

    此时输出串为:2
    运算符栈为:NULL

  2. 扫描到*,入栈

    此时输出串为:2
    运算符栈为:*

  3. 扫描到(,入栈

    此时输出串为:2
    运算符栈为:*(

  4. 扫描到 9,输出

    此时输出串为:2 9
    运算符栈为:*(

  5. 扫描到 +,优先级高于 ( ,入栈

    此时输出串为:2
    运算符栈为:*(+

  6. 扫描到 6 ,输出

    此时输出串为:296
    运算符栈为:*(+

  7. 扫描到 /,优先级大于 +,入栈

    此时输出串为:296
    运算符栈为:*(+/

  8. 扫描到 3,输出

    此时输出串为:2963
    运算符栈为:*(+/

  9. 扫描到 -,优先级低于 / ,所以 / 出栈并输出,

    此时输出串为:2963/
    运算符栈为:*(+

    然后 - 和 +比较,因为+号在栈里,所以+ 出栈并输出

    此时输出串为:2963/+
    运算符栈为:*(

    因为 - 优先级高于 (,-入栈

    此时输出串为:2963/+
    运算符栈为:*(-

  10. 遇到5,输出

    此时输出串为:2963/+5
    运算符栈为:*(-

  11. 遇到 ) ,弹出 -并输出 ,

    此时输出串为:2963/+5-
    运算符栈为:*(

    遇到了 ( ,( 出栈

    此时输出串为:2963/+5-
    运算符栈为:*

  12. 扫描到 +,优先级低于 * ,* 出栈并输出,然后+入栈

    此时输出串为:2963/+5-*
    运算符栈为:+

  13. 扫描到4,输出

    此时输出串为:2963/+5-*4
    运算符栈为:+

  14. 扫描结束,将栈中元素依次出栈输出

    此时输出串为:2963/+5-*4+
    运算符栈为:NULL

结果: 2*(9+6/3-5)+4的后缀表达式为 2963/+5-*4+

后缀表达式转为中缀表达式

  • 从左到右扫描运算符
  • 遇到第运算符时,找打紧挨着他的前面两个相邻的数字,执行运算并把它们看成一个整体的数字
  • 依次类推
    例: 2963/+5-*4+
  1. 从左到右扫描,遇到第一个运算符 /,紧挨着他的前面两个相邻的数字是6和3
    执行6/3并把它们看成一个整体的数字,如下

    296/3 +5-*4+

  2. 遇到 +,紧挨着他的前面两个相邻的数字是9和6/3
    执行9+6/3

    29+6/35-*4+

  3. 遇到 - ,紧挨着他的前面两个相邻的数字是9+6/3和5
    执行9+6/3 - 5

    29+6/3-5*4+

  4. 遇到 ,紧挨着他的前面两个相邻的数字是2和9+6/3-5
    执行2
    *(9+6/3 - 5)

    2*(9+6/3-5)4+

  5. 遇到 +,紧挨着他的前面两个相邻的数字是2*(9+6/3-5)和4
    执行2*(9+6/3 - 5)+4

    2*(9+6/3-5)+4

  6. 结果:2*(9+6/3-5)+4

后缀表达式求值

  • 参考上面后缀转中缀,每执行一次就计算一次即可。
    如上例:
    执行6/3=2
    执行9+2=11
    执行11-5=6
    执行2*6=12
    执行12+4=16
    结果:16

猜你喜欢

转载自blog.csdn.net/qq_41386300/article/details/83119663