中缀以后缀一元运算符的问题



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

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

    • 如果空间,请忽略它。
    • if 运算符,
    • 则不断从堆栈弹出并添加到后缀输出中,直到堆栈为空或堆栈顶部的优先级低于当前运算符。然后,推送当前运算符。
    • 如果为"(",请推送它。
    • 如果 '(,请继续弹出并添加到后缀中,直到找到"("。然后弹出"("而不添加它。
    • 否则,它是一个数字。将其直接添加到后缀输出中。

注意:当我遇到+-时,我可以确定它是二进制运算符还是一元运算符。如果它是二进制的,我将其作为"+"或-添加到堆栈中,但如果它是一元的,我将其添加为"@"或"$"。

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

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

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

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

  1. 您将-标识为一元运算符,并推送@
  2. 您将下一个-标识为一元运算符,看到堆栈上的运算符也是一元运算符,并推送另一个@
  3. 您会看到4,并将其输出。
  4. 在字符串的末尾,弹出两个一元运算符,给出"4@@"。

当然,一元运算符应该比任何其他运算符具有更高的优先级,以便它们始终在推送任何其他运算符之前被弹出。

相关内容

  • 没有找到相关文章

最新更新