中缀表达式 & 后缀表达式

一、什么是中缀表达式 & 后缀表达式?

中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式
举个例子:(1+6/3)*6 - 5

后缀表达式: 更有利于计算机进行计算的一种表达式,不再包含括号(),也不再考虑运算符优先级,一律从左到右进行计算
举个例子: 1 2 +

二、怎么将中缀表达式转换成后缀表达式呢?

利用栈结构来实现中缀表达式 -> 后缀表达式

转换规则:

  • 在中缀表达式中从左往右依次进行操作
  • 括号的优先级最低、其余运算符优先级与我们日常使用一致
  • 遇到数字,直接输出到后缀表达式中(不进行压栈)
  • 遇到左括号,将它压入栈中
  • 遇到右括号,将栈顶的运算符依次弹出并输出到后缀表达式中(直到遇到左括号停止,左括号只弹出不输出)
  • 遇到运算符,分两种情况处理
    1、当前运算符优先级 > 栈顶运算符优先级,进行压栈
    2、当前运算符优先级 <= 栈顶运算符优先级,将栈顶运算符弹出并输出到后缀表达式中,然后当前运算符继续和新的栈顶运算符进行优先级比较…直到当前运算符优先级 > 栈顶运算符优先级停止
  • 如果已经到了中缀表达式的结束位置,中缀表达式处理完毕!
  • 最后,别忘了将栈中还没有弹出的运算符依次弹出并输出到后缀表达式中

举个例子:

中缀表达式:4+6*(5+3*9)-6

下面通过 文字+图片 来详细说明整个转换过程是怎么进行的:

(1)遇到 4,将 4 输出到后缀表达中
在这里插入图片描述

(2)遇到 + ,将 + 压栈
在这里插入图片描述

(3)遇到 6,将 6 输出到后缀表达中
在这里插入图片描述

(4)遇到 * ,进行压栈(因为 * 的优先级大于当前栈顶的 + )
在这里插入图片描述

(5)遇到 ( ,直接压栈
在这里插入图片描述

(6)遇到 5 ,将 5 输出到后缀表达中
在这里插入图片描述

(7)遇到 + ,进行压栈
在这里插入图片描述

(8)遇到 3 ,将 3 输出到后缀表达式中
在这里插入图片描述

(9)遇到 * ,进行压栈
在这里插入图片描述

(10)遇到 9 ,将 9 输出到后缀表达式中
在这里插入图片描述

(11)遇到 ),依次弹出栈顶运算符,直到遇到左括号
在这里插入图片描述

(12)遇到 - ,栈顶运算符 * 优先级更大,所以将 * 弹出并输出,
新栈顶运算符为 + ,同级,所以将 + 弹出并输出,
最后将 - 压栈
在这里插入图片描述

(13)遇到 6 ,将 6 输出到后缀表达式中
在这里插入图片描述

(14)中缀表达式已经到了末尾!最后将栈中还没有弹出的运算符依次弹出并输出
在这里插入图片描述

(15)转换完毕!

后缀表达式: 4 6 5 3 9 * + * + 6 -

其实总结起来就是一个核心的思想:因为表达式的计算中,高优先级的要先运算,低优先级的后运算,所以,我们的每一步转换过程其实都是在将高优先级的先添加到后缀表达式中,因为后续后缀表达式的计算将直接从左到右运算,不再考虑运算符的优先级。

三、那么计算机是怎么计算后缀表达式的值呢?

中缀表达式:4+6*(5+3*9)-6=190

下面演示后缀表达式是如何运算的:
4 6 5 3 9 * + * + 6 -
在这里插入图片描述

我们发现,结果也是190,与中缀表达式计算的结果是一致的,也验证了我们的转换是没有问题的!

备注:

1、中缀表达式转后缀表达式的代码实现可以参考我的另一篇博客java实现中缀表达式转换成后缀表达式

2、中缀表达式转后缀表达式的实际应用可以参考我的另一篇博客java实现计算器

最后,感谢您的阅读,希望可以对需要的人有所帮助!

  • 38
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值