我使用以下逻辑来实现中缀到后缀的转换,以便稍后对其进行评估。
中缀转换上的循环,并在每次迭代中执行以下操作:
- 如果空间,请忽略它。 if 运算符,
- 则不断从堆栈弹出并添加到后缀输出中,直到堆栈为空或堆栈顶部的优先级低于当前运算符。然后,推送当前运算符。
- 如果为"(",请推送它。
- 如果 '(,请继续弹出并添加到后缀中,直到找到"("。然后弹出"("而不添加它。
- 否则,它是一个数字。将其直接添加到后缀输出中。
注意:当我遇到+
或-
时,我可以确定它是二进制运算符还是一元运算符。如果它是二进制的,我将其作为"+"或-
添加到堆栈中,但如果它是一元的,我将其添加为"@"或"$"。
该算法运行良好,除非两个一元运算符彼此相邻。
例如,"--4"
变成"@ 4 @"
,这是错误的。
怎么了?此问题的正确解决方法是什么,不会破坏其他情况?
看起来您需要更改规则,以便不会弹出连续的一元运算符。也就是说,给定 "--4":
- 您将
-
标识为一元运算符,并推送@
- 您将下一个
-
标识为一元运算符,看到堆栈上的运算符也是一元运算符,并推送另一个@
。 - 您会看到
4
,并将其输出。 - 在字符串的末尾,弹出两个一元运算符,给出"4@@"。
当然,一元运算符应该比任何其他运算符具有更高的优先级,以便它们始终在推送任何其他运算符之前被弹出。