【问题标题】:handling unary minus for shunting-yard algorithm处理调车场算法的一元减号
【发布时间】:2013-11-27 15:42:38
【问题描述】:

在将中缀表达式转换为后缀表达式时,有没有更好的方法来处理一元“-”?

显而易见的是,每个一元“-”都带有一个 0 前缀。有人知道更好的实现吗?谢谢!

【问题讨论】:

  • 这个问题有几种解决方案,afaik 他们都在某种程度上是hackish。
  • 在您发帖两年后,我也遇到了同样的问题。这是一种总是相关的问题。这是一个观察结果:添加零(我也考虑过)并不总是有效:示例:--3 将转换为 0 - 3 -3 = -6 大多数解析器会将减号应用为乘以减一的乘积,这将是:- (-3) = 6。干杯,
  • @MrVelez:你是正确的,前缀零不起作用,但出于不同的原因。通过前缀零预处理'--3'应该产生'0-0-3'(不是'0-3-3',第二个3来自哪里?)。即 ',--3' --> '0-,-3' --> '0-0-,3' --> '0-0-3,' 导致后缀 '0 0 - 3 - '。这评估为 -3,这可能不是我们想要的 --3。 \ 如果我们可以将 '0-0-3' 转换为后缀 '0 0 3 - -' 那么它将评估为所需的 3。

标签: algorithm rpn shunting-yard


【解决方案1】:

我几年前的做法是为我的后缀表达式发明一个新的运算符。因此,当我在中缀中遇到一元减号时,我会将其转换为#。所以我对a + -b 的后缀变成了ab#+

当然,我的评估者必须知道# 只弹出一个操作数。

这取决于你如何使用构建后的后缀表达式。如果你想显示它,那么你的特殊# 操作符可能会让人们感到困惑。但是,如果您只是在内部使用它(我曾经使用过),那么它的效果很好。

【讨论】:

  • 我也这样做。我可以确定我“在中缀中遇到一元减号”的唯一方法是维护一个布尔上下文,该上下文定义接下来是否需要运算符或操作数。我想知道其他人做了什么来决定连字符是一元还是二元。
  • @A.I.Breveleri:如果对中缀使用递归下降解析器,则无需显式维护状态即可识别一元运算符。例如,请参阅engr.mun.ca/~theo/Misc/exp_parsing.htm
【解决方案2】:

遍历字符串,将所有一元减号运算符替换为0-,并将结果用括号括起来。例如,给定-20 + (-2 * 50),将其转换为(0-20) + ((0-2) * 50)

【讨论】:

  • 这在例如失败'--20'。通过在前面加上零进行预处理会产生“0-0-20”。这导致后缀'0 0 - 20 -'。这计算为 -20,这可能不是我们想要的 '--20'。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多