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