一、什么是中缀表达式 & 后缀表达式?
中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式
举个例子:(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实现计算器
最后,感谢您的阅读,希望可以对需要的人有所帮助!