所以我用C ++编写了一个基于cmd的计算器。我完成了它,但我想知道,在将中缀转换为postfix后,我有一个名为postfix队列的队列,其中包含正确顺序的运算符/操作数。如何将后缀表达式转换回中缀?
答案 0 :(得分:1)
如果你不介意产生一些额外的括号,那应该很容易。你基本上像往常一样“评估”后缀数据,除了当你到达一个操作员,而不是评估那个操作符并将结果推到堆栈上时,你打印出一个open-paren,第一个操作数,操作符,第二个操作数,最后是一个关闭的操作员。
如果你不介意改变顺序,那么避免无关的括号也很容易。向后走表达式,将operator operand operand
中的内容重新排列为operand operator operand
。如果遇到需要操作数的运算符,则可以使用子表达式进行类似打印。当且仅当其运算符的优先级低于先前遇到的运算符时,才需要将该子表达式括在括号中。
例如,请考虑:a b + c *
。向后走,我们得到*
,然后是c
,所以我们首先打印c *
。然后我们需要另一个操作数,但我们有一个+
,所以我们有一个子表达式。由于+
的优先级低于*
,因此我们需要将该子表达式括在括号中,因此我们得到c * (b + a)
。
相反,如果我们有:a b * c +
,我们会以类似的方式开始,生成c +
,但之后*
更高优先于{{1}我们可以/可以打印+
(或a * b
)而不用parens。
请注意,对于b * a
或-
(或其他任何不可交换的内容),您必须更加谨慎地了解操作数的顺序是否正确。即便如此,你也不会得到原始表达式,只有一个表达式应该在逻辑上等同于它。