8

算法的 I/p 将是这样的表达式:

a+(-b)
a*-b+c

即标准C 编译器支持的任何表达式。

现在我已经将输入格式化为令牌流,令牌包含信息,无论是运算符还是操作数。该算法应该考虑到这一点,并给我一个我可以评估的后缀表达式。

如果我使用标准转换算法,我无法区分一元和二元运算。就像 a*(-b) 会给我 ab-* ,这会以错误的方式评估。

4

3 回答 3

13

如果运算符是表达式中的第一件事,或者在另一个运算符之后,或者在左括号之后,那么它是一个一元运算符。

您必须在输出字符串中为一元运算符使用其他符号,因为否则无法区分后缀表示法中的二元和一元变体。

于 2013-06-22T19:02:09.603 回答
3

在您的输入中,当您有 2 个连续的运算符时,第二个运算符将是一元的。如果您有更多连续的运算符,那么除了第一个运算符之外,所有运算符都是一元运算符。

将所有一元运算-符转换为操作数-1和运算符*,并删除所有一元运算+符。

如果第一个元素是运算符,则它是一元运算符。

括号是一种特殊情况,但您可以在第一次通过时忽略它们。在下面的例子-中是连续的*

4*(-(5))

你的代币会变成:

4
*
(
-1
*
(
5
)
)
于 2013-06-22T18:44:11.543 回答
1

您可以简单地转换-606-以完全消除一元运算符。我喜欢这种方法,因为它更加正交,并且您在处理时不需要处理特殊情况。

另一种方法是对使用相同符号的运算符的一元和二元版本使用不同的符号,例如。-保持二进制减号并~成为否定符号。

于 2017-10-31T08:07:03.183 回答