中缀到Postfix和一元/二元运算符

Jaa*_*jan 3 c# math rpn

我有一段代码将中缀表达式转换为内存中的表达式树.这很好用.只有一个小问题.我只是想弄清楚如何正确地使用一元运算符(正确的关联运算符).

使用以下中缀表达式:

+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)

现在你不需要担心一元+或 - 并且可能忘记用它们所采用的参数数量来标记运算符.