后缀表达式处理
这里主要了解下,计算机处理运算符号的思想。
如题 2020年10月
分析
咋一看,还是挺生的,脑子里有些印象吧,但还是没分清,中缀表达式转成后缀表达式与后后缀表达式在计算机处理的过程,还得继续深入了解下思想。
其实,这里就是讲义的内容:数据结构复习之队列,后缀表达式处理,已经很清楚了,这里主要是结合本题,再做一下总结。
解决
关于中缀表达式
中缀表达式:a*(b+c);
先要明白中缀到底是一个什么样的操作?中缀和中根是一个意思,先遍历左孩子,再根,再遍历右孩子。中缀特指操作符以中缀形式,处于两个操作数的中间。中缀表达式的括号是必须的。
中缀表达式意义
若要用C写个这样的表达式,不难,并且c语言支持这样的写法!但对于计算机而言,中间经历了很多的步骤才实现。可以说,计算机通过中级c语言或高级语言处理这种逻辑是非常不划算的。计算机如何处理表达式呢?那就得是后缀表达式了。
中缀如何转成后缀表达式呢??
后缀,就是将运算符放到操作数的最后。
中缀转后缀处理思想
逻辑很重要,先不要管实际的算法。a*(b+c);//对于这个表达式而言
先要算,b+c;–> 采用后缀的话,就是bc+;得到一个结果,相当于是一个数,要脑补出来。
然后是a* --> 采用后缀的话 ,一样是a*不变。
合起来中缀转成后缀就是 abc+*;//这是第二问的答案
特点
后缀操作数的顺序与中缀是完全一样的。
运算符的顺序与中缀运算符的逻辑顺序完全一样。
例子
2*(3+5)+7/1-4用后缀表达式表示为:
235+*71/+4-;//脑补出中间数,才有利于写出正确的表达式。
中缀转后缀处理算法
数据结构复习之队列,后缀表达式处理;已经很清楚了;总结下过程就可以了。
算法依靠一个队列和一个栈实现。
队列的作用就是输出后缀表达式,栈用来处理中缀表达式中符号优先级。这其实也符合后缀的定义,就是将运算符号放到操作数的最后。也是这个特点决定的。
数肯定是直接进队列就可以。
运算符号,入栈前,先比较栈里是否存在优先级高的或优先级相等的运算符,存在的话,就先把它们出栈;出栈后直接进入队列就可以。遇到左括号时,运算符先入栈,当然入栈时,还是比较之前存在的运算符优先级,存在优先级高的,那就将优先级高的先出栈,再入栈,然后再移出的优先级高的再入栈,这样调整,直到碰到右括号,依次弹出运算符。
这样操作后,便将中缀转换成了后缀表达式。
所以,第一问的答案就是,*先入栈,遇到左括号,+入栈;遇到右括号时,+出栈,然后*再出栈。
计算机处理后缀表达式的过程
课件是没有总结的,只给出了过程。
计算机处理后缀表达式的思想
利用一个栈来实现,存储运算符及中间计算结果==(考点)==。
过程算法
从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
操作实例
abc+*,这个后缀表达式处理过程为:
a,b,c入栈,遇到+,将c,b出栈,注意:这里其实是有顺序的,尤其是对于-号等的情形,先出栈的要放到运算符号的右面,这样才符合左根右的后根遍历的规则。
得到运算结果后,再将运算结果入栈。
遇到*,将上一步的运算结果和a出栈。
总结
重点是将逻辑上的中缀转化成后缀,至于计算机处理后缀的过程,那真是非常的简单。就是出栈、入栈。