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

最佳答案

如果您不介意产生一些额外的括号,这应该很容易。基本上,您像往常一样“评估”后缀数据,除了当您到达一个运算符时,不是打印该运算符并将结果压入堆栈,而是打印出一个开放括号,第一个操作数,运算符,第二个操作数,最后是一个封闭的对象。

如果您不介意更改顺序,那么避免多余的括号也很容易。向后移动表达式,将内容从operator operand operand重新排列为operand operator operand。如果遇到需要操作数的运算符,则有一个子表达式可以类似地打印出来。仅当且仅当该子表达式的运算符的优先级低于先前遇到的运算符时,才需要将该子表达式括在括号中。

例如,考虑:a b + c *。向后走,我们得到*,然后是c,因此我们首先打印出c *。然后我们需要另一个操作数,但是我们有一个+,所以我们有一个子表达式。由于+的优先级低于*的优先级,因此我们需要将该子表达式放在括号中,以便获得c * (b + a)

相反,如果我们有:a b * c +,我们将类似地开始生成c +,但是由于*的优先级高于+,因此我们可以/可以打印出a * b(或b * a)而无需加括号。

请注意,使用-/(或其他任何不可交换的代码)时,您必须更加小心以确保操作数的顺序正确。即使这样,您也不会取回原始表达式,而只是在逻辑上应该与其等效的表达式。

10-08 09:24