我有一段代码将中缀表达式转换为内存中的表达式树。这很好用。只有一个小麻烦。我只是想知道如何正确地涉及一元运算符(正确的关联运算符)。
使用以下中缀表达式:
+1 + +2 - -3 - -4
我希望 RPN 为:
1+2++3-4--
然而,我能找到的所有在线中缀后缀转换器都没有按照我期望的方式处理这个示例。有没有人对处理右结合运算符有明确的解释,特别是可能被误认为一元运算符的二元运算符?
编辑/澄清: 我想知道在从中缀到后缀的转换过程中如何处理一元运算符。即:将相同的“-”字符识别为一元运算符而不是二元运算符,因此具有不同的优先级。我会考虑使用可能具有两个状态的状态机,但是......?
最佳答案
好吧,您需要在解析 阶段确定给定的运算符是二元还是一元。完成此操作后,在创建 RPN 时,您可以将运算符标记为采用 2 个或 1 个参数。
您可以尝试使用 Shunting Yard进行解析(并同时创建 RPN)的算法,该算法也被设计为与一元运算符一起使用。
无论如何,如果您只关心一元 + 或 -,当您看到“意外”出现的 + 或 - 时,只需插入一个带括号的 0。
例如
+1++2 - -3 - -4
你应该能够通过它并转换为
(0+1) + (0+2) - (0-3) - (0-4)
现在您无需担心一元 + 或 - 并且可能会忘记用运算符采用的参数数量来标记运算符。
关于c# - 后缀和一元/二元运算符的中缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431863/