我有一段代码将中缀表达式转换为内存中的表达式树.这很好用.只有一个小问题.我只是想弄清楚如何正确地使用一元运算符(正确的关联运算符).
使用以下中缀表达式:
+1 + +2 - -3 - -4
Run Code Online (Sandbox Code Playgroud)
我希望RPN为:
1+2++3-4--
Run Code Online (Sandbox Code Playgroud)
然而,我能找到的在线中缀后转换器都没有像我期望的那样处理这个例子.有没有人对处理右关联运算符有明确的解释,特别是那些可以被误认为是一元运算符的二元运算符?
编辑/澄清:我想知道如何在从中缀到后缀的翻译过程中处理一元运算符.即:识别相同的' - '字符,例如是一元而不是二元运算符,因此具有不同的优先级.我会想到使用状态机可能有两个状态但是......?
小智 5
那么,您需要在解析阶段确定给定的运算符是否为二进制/一元.一旦这样做,当您创建RPN时,您可以将运算符标记为采用2或1个参数.
您可以尝试使用Shunting Yard算法进行解析(以及同时创建RPN),这也是为了与一元运算符一起工作.
在任何情况下,如果您关心的只是一元+或 - ,当您看到"意外"出现+或 - 时,您可以只插入带括号的0.
例如
+1 + +2 - -3 - -4
你应该能够通过它并转换为
(0+1) + (0+2) - (0-3) - (0-4)
现在你不需要担心一元+或 - 并且可能忘记用它们所采用的参数数量来标记运算符.