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

本文详细讲解了中缀表达式转换为后缀表达式的算法过程,包括扫描表达式、数字和运算符的处理规则,并通过实例演示了整个转换流程。同时,文章还介绍了如何将后缀表达式转回中缀表达式,以及如何求解后缀表达式的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 中缀表达式:常见的运算表达式,如(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值