后缀表达式是什么?我们平时的运算式子有符号优先级的概念,例如 3+5*(2+1),这也叫中缀表达式,我们计算时会先算括号中2+1的值 ,然后再乘以5,最后再和3相加,实际的运算过程的先后与列出式子的顺序大不相同。
人在计算前可以通过眼睛全局观察整个式子的概况然后进行计算,但是计算机却很难做到这点,在3+5*(2+1)中,计算机读到了3+,然后该读到5了,它到底是用3+5直接算出结果还是让3+等着,看看5后面的情况,如果5后面是+,它是继续等着5后面的+号的后是否有优先级更高的符号还是计算之前的3+5呢,所以对于计算机来说顺着中缀表达式计算是很矛盾又复杂的。所以人们发明出了后缀表达式这种对于计算机来说“很容易”看懂的式子排列结构,便是后缀表达式,因为所有的符号都是在要运算数字的后面出现,所以叫后缀。
那么后缀表达式如何写呢?或者说已知中缀表达式,如何转化成后缀呢,那得首先提到栈的概念;
栈是计算机的一种存储方式,栈像个弹匣一样,所有数据类比成子弹,先放入的子弹在弹夹底部,后放入的在弹夹顶部,使用的时候,射出的子弹先是弹夹顶部,然后一个一个向弹匣底部走。即先入后出,后入先出;如图
![](https://i-blog.csdnimg.cn/blog_migrate/28c94e3c0a944050756829ebc0f28b21.gif)
转换:从左到右遍历中缀式子,如果是数字就直接输出,若是符号放入栈。
如果是右括号,则符号依次出栈,直到左括号出栈为止
如果要放入的符号没有比之前栈顶的符号优先级高,那就使栈顶符号出栈,然后让当前的符号进栈。
拿 3+5*(2+1)举例
1.3输出
2.+进栈
3.5输出
4.*进栈 *比+优先级高,不操作
5.(进栈
6.2输出
7.+进栈 由于+下有左括号,因此不操作,等右括号
8.1输出
9.)进栈
10.(出栈 +出栈输出 )出栈 //左右括号间只有+号
11.表达式遍历完了 那就输出栈中剩余的* +
最终结果:3521+*+
![](https://i-blog.csdnimg.cn/blog_migrate/bd79e55958fcef1738f829e1ce345f59.gif)
计算机是如何操作后缀表达式的?
将后缀表达式遍历,遇到数字入栈。遇到符号使栈顶的2个数字进行运算,然后运算的结果入栈,依次进行
拿3521+*+举例
1.3521入栈
2.+号 使2+1得3,3入栈
3.*号 使3*5得15,15入栈
4.+号 使15+3得18,得出结果18
结果和3+5*(2+1)的结果一样,所以正确
最后关于中缀转换成后缀有个简易的方法:
那就是给中缀所有运算关系加上括号,然后把符号移到相应的括号后面,最后去掉括号即可
拿3+5*(2+1)举例
加完括号后为 (3+(5*(2+1)))
转移符号 (3(5(21)+)*)+
最后去括号 3521+*+