算法的 I/p 将是这样的表达式:
a+(-b)
a*-b+c
即标准 C 编译器支持的任何表达式。
现在我已经将输入格式化为标记流,令牌包含信息,无论是运算符还是操作数。算法应该接受这一点,并给我一个我可以评估的后缀表达式。
如果我使用标准转换算法,我无法区分一元和二进制操作。就像 a*(-b( 会给我 ab-*,它会以错误的方式评估。
如果运算符是表达式中的第一件事,或者出现在另一个运算符之后,或者出现在左括号之后,那么它是一个一元运算符。
您必须在输出字符串中对一元运算符使用其他符号,否则无法在后缀表示法中区分二进制和一元变体。
在您的输入中,当您有 2 个连续运算符时,第二个运算符将是一元的。如果有多个连续运算符,则除第一个运算符外,其他运算符都将是一元运算符。
将所有一元-
运算符转换为操作数-1
运算符和运算符*
,并删除所有一元运算符+
运算符。
如果第一个元素是运算符,则它是一元运算符。
括号是一种特殊情况,但您可以执行忽略它们的第一遍。在下面的示例中,-
连续到 *
。
4*(-(5))
您的代币将变为:
4
*
(
-1
*
(
5
)
)
您可以简单地将-6
转换为06-
以完全消除一元运算符。我喜欢这种方法,因为它更正交,并且在处理时不需要处理特殊情况。
另一种方法是对一元和二进制版本的运算符使用相同的符号使用不同的符号,例如。 -
仍然是二进制减号,~
成为否定符号。