C ++将Postfix转换为中缀

时间:2012-03-07 23:21:06

标签: c++ queue calculator infix-notation postfix-notation

所以我用C ++编写了一个基于cmd的计算器。我完成了它,但我想知道,在将中缀转换为postfix后,我有一个名为postfix队列的队列,其中包含正确顺序的运算符/操作数。如何将后缀表达式转换回中缀?

1 个答案:

答案 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-(或其他任何不可交换的内容),您必须更加谨慎地了解操作数的顺序是否正确。即便如此,你也不会得到原始表达式,只有一个表达式应该在逻辑上等同于它。