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