C 考虑一元运算符的中缀到后缀算法

C 考虑一元运算符的中缀到后缀算法,c,algorithm,shunting-yard,C,Algorithm,Shunting Yard,algo的I/p将是如下表达式: a+(-b) a*-b+c i、 e标准C编译器支持的任何表达式 现在我已经将输入格式化为令牌流,这些令牌包含信息,无论是运算符还是操作数。 算法应该考虑到这一点,并给我一个后缀表达式,我可以计算 如果使用标准转换算法,则无法区分一元运算和二元运算。 就像a*(-b)会给我ab-*,这将以错误的方式计算。在您的输入中,当您有两个连续的运算符时,第二个运算符将是一元运算符。 如果有多个连续运算符,则除第一个运算符外,所有运算符都将是一元运算符 将所有一元-运算符

algo的I/p将是如下表达式:

a+(-b)
a*-b+c
i、 e标准C编译器支持的任何表达式

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

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

在您的输入中,当您有两个连续的运算符时,第二个运算符将是一元运算符。 如果有多个连续运算符,则除第一个运算符外,所有运算符都将是一元运算符

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

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

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

4*(-(5))
您的代币将变成:

4
*
(
-1
*
(
5
)
)

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


您必须在输出字符串中为一元运算符使用另一个符号,否则无法在后缀符号中区分二进制和一元变体。

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


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

问题在哪里?它使用另一个符号(例如“\u”)在作为一元运算符“-”的符号的输出中,问题是:建议修改标准算法或新算法来解决我的问题。@user2512249只需为一元运算符使用不同的符号即可,正如@BLUEPIXY建议的那样,我最后看到您更喜欢另一个答案,实际上,您需要在输出中为一元运算符指定一个特殊符号。最后,
a*(-b)
的转换字符串看起来如何?您是否坚持使用C表示法,或者您也接受了类似于4(5-2)的东西,其中只隐含*符号?我已经定义了一个包含以下成员的类:int操作码、字符串操作数。我首先将输入字符串转换为此类的数组,因此在扫描时,我检查它是一元运算还是二进制运算,并相应地分配操作码。然后我将其转换为后缀,在评估刚才的if-else条件时,我处理了一元运算符(我已经知道哪些是一元运算符,因为我给它们分配了一组特定的操作码),如果有几个连续的运算符呢?这条规则还适用吗?例如,
5++-2
可以,但是
5++-2
呢?@htossli是的,它非常有用,但是我们必须对不同的操作员使用不同的方法。我们如何处理ln(x)?