我应该将以下内容转换为后缀形式:
(A + B * C) / (D - E * F)
我得到这个答案:ABC*+DEF*-/
这个对吗?如果我使用了错误的后缀形式,那么之后的许多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。
我应该将以下内容转换为后缀形式:
(A + B * C) / (D - E * F)
我得到这个答案:ABC*+DEF*-/
这个对吗?如果我使用了错误的后缀形式,那么之后的许多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。
我知道这是一个旧的提交,但这里有
这是正确的形式。您可以通过自己遍历后缀并将其转换回中缀来轻松检查它,就像这样,从一个空堆栈开始。
A
是数组中的第一个元素,它是一个数字,所以将它压入堆栈。这同样适用于B and
C . Therefore your stack is now
A,B,C`。
下一个标记是 operator( *
),它需要两个操作数。因此,从堆栈中弹出顶部的两个操作数,或B
和C
。将两者结合,由运算符分开,并将其压入堆栈。为了简化算法,只需将括号括起来。你的堆栈现在是A,(B*C)
.
您的下一个标记是另一个二元运算符(+
)。重复与上述相同的过程,您的堆栈为(A+(B*C))
.
对剩下的部分重复这个过程,你会得到一个等价于的表达式(A+B*C)/(D-E*F)
是的,通过迭代是一种检查这一点的方法,但您也可以将此表达式从中缀开头转换为后缀。表达式:-(A+B C)/(DE F)从表达式中的第一个符号开始。
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*-/
随着更高优先级的运算符的到来,它可以与已经具有较低优先级的运算符一起放入堆栈,但在相反的情况下,如果堆栈中的更高优先级运算符和较低优先级的符号出现,则更高优先级的运算符将从堆栈弹出到后缀表达式。注意: - 没有两个相同优先级的运算符可以一起留在堆栈中,因为第二个运算符来相同优先级的第一个运算符将弹出。