首页 > 试题广场 >

某表达式的前缀形式为"+-*^ABCDEF+GH",它的

[单选题]
某表达式的前缀形式为"+-*^ABCD/E/F+GH",它的中缀形式为()
  • A^B*C-D+E/F/G+H
  • A^B*(C-D)+(E/F)/G+H
  • A^B*C-D+E/(F/(G+H))
  • A^B*(C-D)+E/(F/(G+H))
前缀表达式的计算机求值特点:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

根据从右至左扫描计算过程如下:
题目中的前缀形式为:+-*^ABCD/E/F+GH
1) 首先扫描 H,是数字 入栈 ,栈中为: H
2) 扫描 G 为数字 入栈 ,栈中为:G,H
3)扫描+ 为运算符 ,依次弹出G ,H ,得到 G+H 的结果 入栈,栈中为: G+H(在这里方便讲解 标记为  G+H)
4)扫描 F 为数字 ,入栈 ,栈中为  F, G+H
5)扫描 / 为运算符, 依次弹出 F,G+H ,计算F/(G+H) 的结果入栈 ,栈中为 F/(G+H)
6)扫描 E 为数字,入栈,栈中为 E,  F/(G+H)
7) 扫描 / 为运算符, 依次弹出E, F/(G+H) ,计算 E/(F/(G+H))
8)扫描 D 为数字,入栈 栈中为:D, E/(F/(G+H))
9) 扫描 C 为数字,入栈 栈中为:C,D, E/(F/(G+H))
10) 扫描 B 为数字,入栈 栈中为:B,C,D, E/(F/(G+H))
11) 扫描 A 为数字,入栈 栈中为:A,B,C,D, E/(F/(G+H))
12) 扫描^ 为数字,依次弹出 A,B 计算 A^B的结果入栈, 栈中为:A^B ,C,D, E/(F/(G+H))
13) 扫描*为数字,依次弹出 A^B,C 计算 A^B*C的结果入栈, 栈中为:A^B* C,D, E/(F/(G+H))
14) 扫描-为数字,依次弹出 A^B*C,D 计算 A^B*C-D的结果入栈, 栈中为:A^B* C-D, E/(F/(G+H))
15) 扫描+为数字,依次弹出 A^B*C-D, E/(F/(G+H))   计算 A^B*C-D+  E/(F/(G+H)) 的到结果
最后得到的表达式为:  A^B* C-D+ E/(F/(G+H))
发表于 2015-09-25 08:48:17 回复(8)
根据前序遍历(+-*^ABCD/E/F+GH)和表达式的性质得到二叉树如下:

中序遍历为:A^B*C+D+D/F/(G+H)
注意:遍历是要考虑运算符的优先级
发表于 2015-09-11 15:02:48 回复(8)
C

首先找到前两个操作数,在这里是AB,取离它最近的那个符号,是^,组合起来,作为一项,这样表达式变成 + - * (A ^ B) C D / E / F + G H
继续这样,前两个操作数是(A ^ B)和C,符号是*,合并作为一项,变成 + - (A ^ B * C) D / E / F + G H

继续,变成 + (A ^ B * C - D) / E / F + GH

这个时候,+的一个操作数是(A ^ B * C - D),另一个操作数是第一个/后边的结果

然后我们看怎么解 / E / F + GH,还是这样,被除数是E,除数是 / F + GH

/ F + GH的被除数是F,除数是 + G H, 即为(G + H), 这项是F / (G + H)

回到上一步,/ E / F + G H是E / (F / (G + H))

再往上回一步,得到整个表达式: (A ^ B * C - D) + E / (F / (G + H))

抽象一点,大概是这样:对于一个表达式,找到第一个操作数,它肯定是它左边紧挨着的那个运算符的左值(比如这道题里的A是第一个操作数,是^的左值)。操作数右边如果是操作数,那么肯定是之前找到的操作符的右值,如果是操作符,重复这个过程.

中缀表达式为:

发表于 2015-01-12 20:27:52 回复(2)
总结了前中后缀表达式的特点,以及相互转换的规则及例子:

编辑于 2019-10-21 16:52:37 回复(2)
前缀表达式,从右往左扫描,遇到操作数压栈,遇到操作符出栈两个数运算,其结果入栈; 后缀表达式,从左往右扫描,遇到操作数压栈,遇到操作符出栈两个数运算,其结果入栈 中缀表达式,给自己看的咯, (前缀和后缀表达式,都是一个栈就可以搞定运算;中缀表达式就需要两个栈,而且还需要判断运算符优先级)
发表于 2017-12-18 14:16:36 回复(1)
加括号法 从表达式中的运算符数值数值序列开始加括号 +-*(^ab)cd/e/f(+gh) 把括号看成一个数值 +-(*(^ab)c)d/e(/f(+gh)) ..... (+(-(*(^ab)c)d)(/e(/f(+gh)))) 最后把符号移动到两数值中间就可以。 ((((a^b)*c)-d)+(e/(f/(g+h))))
发表于 2016-08-03 11:27:07 回复(0)
中缀表达式转后缀表达式转换技巧:加括号,移符号,去括号; eg:前缀:A+(B+C)*D 1. 先将中缀表达式加括号:(A + ((B + C) * D)); 2. 再把运算符移到括号后面(前缀移到前面):(A ((B C)+ D)*)+; 3. 把括号去掉:ABC+D*+。 而且这种方法也适合于中缀转前缀。
发表于 2022-01-08 18:17:40 回复(1)


发表于 2018-08-06 16:15:58 回复(0)
中缀转前后缀看:http://www.xuebuyuan.com/1630620.html

前后缀转中缀看:http://blog.csdn.net/antineutrino/article/details/6763722/
发表于 2016-08-16 14:22:47 回复(0)
前缀表达式从右往左进栈,后缀表达式从左往右进栈
发表于 2018-09-17 20:35:59 回复(0)
先按遇到数字压栈,遇到符号,弹出栈顶两个数的规则,求出表达式
发表于 2017-06-12 16:53:52 回复(0)
前缀表达式的求值过程是从右往左逐步计算的。首先遇到的是最右边的操作数,然后是它前面的操作数和运算符,依此类推。
中缀表达式即我们常见的表达式。
而后缀表达式和前缀表达式相反,从左至右依次入栈,遇到运算符则出栈两个运算数进行运算。
发表于 2023-09-03 12:41:45 回复(0)
前缀表达式变中缀表达式,从右至左,数字进栈,若遇到符号,则弹出两个元素并把运算结果入栈,即可得到易理解的中缀表达式。
发表于 2023-02-06 15:22:40 回复(0)
前缀表达式转换计算式子的方法:
从右向左遍历前缀表达式,遇到符号就弹出两个数字运算后再入栈
发表于 2020-03-22 15:07:46 回复(0)
A^B*C-D+E/F/G+H    HGFE//DCBA^*-++           ++-*^ABCD//EFGH
A^B*(C-D)+(E/F)/G+H  HGFE/DC-BA^*+/+         +/+*^AB-CD/EFGH
A^B*C-D+E/(F/(G+H))   HG+F/E/DCBA^*-+        +-*^ABCD/E/F+GH
A^B*(C-D)+E/(F/(G+H))  HG+F/E/DC-BA^*+       +*^AB-CD/E/F+GH
需要熟练掌握下 转化法则,不难。当然运算符树也可以解决这个问题,但是往往会犯错误
中缀变后缀, 从左至右,不能忍同级
中缀变前缀    从右至左    可以忍同级 倒叙输出

发表于 2018-06-17 23:28:50 回复(0)
*优先级高于^,所以个人觉得应该为(A^B)*C-D+E/(F/(G+H))
发表于 2016-05-23 10:49:23 回复(0)
根据算法的优先级来确定,可以使用括号来描述的

发表于 2016-04-27 14:17:33 回复(0)