中缀表达式a*(b+c)一d的后缀表达式是( )。

admin2022-06-07  2

问题 中缀表达式a*(b+c)一d的后缀表达式是(    )。

选项 A、abcd*+—
B、abc+*d—
C、abc*+d—
D、—+*abcd

答案B

解析 本题转化过程如图4—5所示。

由图4—5可以写出以下转化过程:
第一步:b+c→bc+(假设x=“bc+”)
第二步:a*x→ax*(假设y=“ax*”)
第三步:y—d→yd—
将xy还原后得到:abc+*d—。
补充知识点(1):中缀表达式转换成后缀表达式的另一种方式。
解析:可以通过手工加上、除掉括号来将中缀表达式转换成后缀表达式,其过程如下:先根据中缀表达式的求值次序加上括号,将右括号用相应的运算符替换,再除掉所有的左括号。
例如,中缀表达式“5+2*(1+6) —8/2”转换成后缀表达式的过程如下:手工判断该表达式的计算过程。首先肯定是先计算2*(1+6),加上括号变为“5+(2*(1+6))—8/2”,再计算除法8/2,加上括号变为“5+(2*(1+6))— (8/2)”,接着进行加法运算,加上括号变为“(5+(2*(1+6)))一(8/2)”,最后再进行减法运算,加上括号变为“((5+(2*(1+6)))一(8/2))”。运算符和右括号的对应关系如图4.6所示,将右括号用对应的运算符替换,变为“((5(2(16+*+(8 2/一”,最后除掉所有左括号得到的后缀表达式为“5216+*+82/一”。

注:本方法需要人工判断表达式的执行顺序(即加括号),所以无法用程序实现。
一此方法引自李春葆老师的书籍
按照以上方式可以很轻松地解题,不妨试着将中缀表达式a*(b+c)—d转换成后缀表达式。
第一步:进行乘法运算,加括号变为:(a*(b+c))一d。
第二步:进行减法运算,加括号变为:((a*(b+c))一d)。
第三步:找出运算符和右括号的对应关系,将右括号用对应的运算符替换,变为((a(bc+*d一。
第四步:最后除掉所有左括号得到的后缀表达式为:abc+*d—。
补充知识点(2):怎么将后缀表达式转换成中缀表达式?
解析:当遇到数值的时候入栈,当遇到运算符的时候,连续两次出栈,将两个出栈元素结合运算符进行运算,将结果当成新遇到的数值入栈。如此往复,直到扫描到终止符“\0”,此时栈底元素值即为表达式的值。
例:将后缀表达式xy+z+转换为中缀表达式。
先将x、y入栈,遇到了‘+’,然后弹出栈顶的2个元素,即x、y,然后对x、y做加法,现在将(x+y)的值入栈,然后Z入栈,遇到了操作符‘+’,所以最后的中缀表达式为:(x+y)+z。
注意:中缀表达式转化成后缀或者是前缀,结果并不一定唯一。比如ab+c d*+e/同样是(a+b+c*d)/e的后缀式。后缀式和前缀式都只有唯一的一种运算次序,而中缀式却不一定,后缀式和前缀式是由中缀式按某一种运算次序而生成的,因此对于一个中缀式可能有多种后缀式或者前缀式。比如a+b+c可以先算a+b也可以先算b+c,这样就有两种后缀式与其对应,分别是ab+c+和abc++。
例:下列关于后缀表达式的比较中,结果为“假”的是(    )。
Ⅰ.  xy+z+==xyz++
Ⅱ.  xy+z—==xyz--+
Ⅲ.xy—z+==xyz+—
Ⅳ.xy—z—==xyz--
A.Ⅰ
B.Ⅰ、Ⅱ
C.Ⅲ、Ⅳ
D.Ⅱ、Ⅳ
C。本题考查后缀表达式。
Ⅰ:xy+z+==xyz++转换成中缀表达式为(x+y)+z==x+(y+z),比较结果为“真”。
Ⅱ:xy+z—==xyz—+转换成中缀表达式为(x+y)一z==x+(y—z),比较结果为“真”。
Ⅲ:xy—z+==xyz+—转换成中缀表达式为(x—y)+z==x一(y+z),比较结果为“假’’。
Ⅳ:xy—z—=—xyz--转换成中缀表达式为(X—y)一z==x一(y—z),比较结果为“假”。
综上所述,ⅡⅠ、Ⅳ为假。
转载请注明原文地址:https://kaotiyun.com/show/Vk3i777K
0

相关试题推荐
最新回复(0)