Data structures 一元运算符的中缀到后缀问题

Data structures 一元运算符的中缀到后缀问题,data-structures,stack,postfix-notation,infix-notation,shunting-yard,Data Structures,Stack,Postfix Notation,Infix Notation,Shunting Yard,我使用以下逻辑实现中缀到后缀的转换,以便稍后对其进行评估 在中缀转换上循环,并在每次迭代中执行以下操作: 如果是空格,请忽略它。 如果是运算符,则继续从堆栈弹出并添加到后缀输出,直到堆栈为空或堆栈顶部的优先级低于当前运算符。然后,按下当前运算符。 如果有,就推它。 如果',继续弹出并添加到后缀,直到找到。然后在不添加它的情况下弹出。 否则,它就是一个数字。将其直接添加到后缀输出。 注意:当我遇到+或-,我可以确定它是二进制还是一元运算符。如果它是二进制的,我将其作为“+”或-”添加到堆栈中,但如

我使用以下逻辑实现中缀到后缀的转换,以便稍后对其进行评估

在中缀转换上循环,并在每次迭代中执行以下操作:

如果是空格,请忽略它。 如果是运算符,则继续从堆栈弹出并添加到后缀输出,直到堆栈为空或堆栈顶部的优先级低于当前运算符。然后,按下当前运算符。 如果有,就推它。 如果',继续弹出并添加到后缀,直到找到。然后在不添加它的情况下弹出。 否则,它就是一个数字。将其直接添加到后缀输出。 注意:当我遇到+或-,我可以确定它是二进制还是一元运算符。如果它是二进制的,我将其作为“+”或-”添加到堆栈中,但如果它是一元的,我将其作为“@”或“$”添加到堆栈中

该算法运行良好,除非两个一元运算符相邻

例如,-4变成了@4@,这是错误的


怎么了?这个问题的正确解决方法是什么,它不会破坏其他情况?

看起来您需要更改规则,这样您就不会弹出连续的一元运算符。也就是说,给定-4:

将-标识为一元运算符,然后按@ 将下一个-标识为一元运算符,查看堆栈上的运算符也是一元运算符,然后按下另一个@。 您可以看到4,并将其输出。 在字符串的末尾,弹出两个一元运算符,得到4@@@1。
当然,一元运算符应该比任何其他运算符具有更高的优先级,因此它们总是在推送任何其他运算符之前被弹出。

您所描述的听起来是正确的解决方案。不看你的代码,就不可能说出你哪里出错了。@JimMischel它不需要代码。手工按照算法生成@4@for-4@JimMischel让我一步一步地解释:首先我会找到-这是一元运算符,所以我会推它。然后,我会找到另一个-也是一元运算符,我会弹出'@',并将其添加到输出中。然后,我将找到4并将其添加到输出中,然后将堆栈中唯一的一项添加到输出中。手工遵循算法会导致错误答案@4@正确答案应该是4@@@。我做错了什么?