0

我应该将以下内容转换为后缀形式: (A + B * C) / (D - E * F)

我得到这个答案:ABC*+DEF*-/

这个对吗?如果我使用了错误的后缀形式,那么之后的许多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。

4

2 回答 2

1

我知道这是一个旧的提交,但这里有

这是正确的形式。您可以通过自己遍历后缀并将其转换回中缀来轻松检查它,就像这样,从一个空堆栈开始。

A是数组中的第一个元素,它是一个数字,所以将它压入堆栈。这同样适用于B andC . Therefore your stack is nowA,B,C`。

下一个标记是 operator( *),它需要两个操作数。因此,从堆栈中弹出顶部的两个操作数,或BC。将两者结合,由运算符分开,并将其压入堆栈。为了简化算法,只需将括号括起来。你的堆栈现在是A,(B*C).

您的下一个标记是另一个二元运算符(+)。重复与上述相同的过程,您的堆栈为(A+(B*C)).

对剩下的部分重复这个过程,你会得到一个等价于的表达式(A+B*C)/(D-E*F)

于 2014-03-12T13:58:56.303 回答
1

是的,通过迭代是一种检查这一点的方法,但您也可以将此表达式从中缀开头转换为后缀。表达式:-(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*-/

随着更高优先级的运算符的到来,它可以与已经具有较低优先级的运算符一起放入堆栈,但在相反的情况下,如果堆栈中的更高优先级运算符和较低优先级的符号出现,则更高优先级的运算符将从堆栈弹出到后缀表达式。注意: - 没有两个相同优先级的运算符可以一起留在堆栈中,因为第二个运算符来相同优先级的第一个运算符将弹出。

于 2016-06-26T13:23:54.940 回答