【发布时间】:2013-09-22 02:09:21
【问题描述】:
我应该将以下内容转换为后缀形式:
(A + B * C) / (D - E * F)
我得到了这个答案:ABC*+DEF*-/
这是正确的吗?如果我使用了错误的后缀形式,那么之后有许多问题都是不正确的。如果我错了,你能告诉我为什么吗?感谢您的帮助。
【问题讨论】:
标签: postfix-notation infix-notation
我应该将以下内容转换为后缀形式:
(A + B * C) / (D - E * F)
我得到了这个答案:ABC*+DEF*-/
这是正确的吗?如果我使用了错误的后缀形式,那么之后有许多问题都是不正确的。如果我错了,你能告诉我为什么吗?感谢您的帮助。
【问题讨论】:
标签: postfix-notation infix-notation
我知道这是一个旧的提交,但这里是
这是正确的形式。您可以通过自己遍历后缀并将其转换回中缀来轻松检查它,就像这样,从一个空堆栈开始。
A是数组的第一个元素,是一个数字,所以压入栈中。 B andC. Therefore your stack is nowA,B,C`也是如此。
下一个标记是一个运算符(*),它需要两个操作数。因此,从堆栈中弹出顶部的两个操作数,即B 和C。将两者结合,由运算符分开,并将其压入堆栈。为了简化算法,只需将括号括起来。你的堆栈现在是A,(B*C)。
您的下一个标记是另一个二元运算符 (+)。重复与上述相同的过程,您的堆栈为(A+(B*C))。
对其余部分重复该过程,您将得到一个等效于(A+B*C)/(D-E*F)的表达式
【讨论】:
是的,通过迭代返回是一种检查方法,但您也可以将此表达式从中缀开头转换为后缀。 表达式:-(A+BC)/(D-EF)从表达式中的第一个符号开始。
symbol stack(operator) postfix(operand)
( (
A ( A
+ (+ A
B (+ AB
* (+* AB
C (+* ABC
) (+*) ABC
as bracket closes every symbol inside bracket popout(LIFO)
ABC*+
/ / ABC*+
( /( ABC*+
D /( ABC*+D
- /(- ABC*+D
E /(- ABC*+DE
* /(-* ABC*+DE
F /(-* ABC*+DEF
) /(-*) ABC*+DEF
/ ABC*+DEF*-
as all symbol have been done operator left in stack will popout(LIFO)
ABC*+DEF*-/
随着更高优先级的运算符的到来,它可以与已经较低优先级的运算符一起放入堆栈,但在相反的情况下,如果堆栈中的更高优先级运算符和较低优先级的符号出现,则更高优先级的运算符将从堆栈弹出到后缀表达式。注意:- 没有两个相同优先级的运算符可以一起留在堆栈中,因为第二个运算符来第一个相同优先级的运算符会弹出。
【讨论】: