我正在实施shunting-yard algorithm。我在检测运营商缺少参数时遇到问题。 wikipedia entry在这个主题上非常糟糕,他们的代码也崩溃了以下示例。
例如3 - (5 + )
不正确,因为+
缺少参数。
在算法到达)
之前,运算符堆栈包含- ( +
,操作数堆栈包含3 5
。然后就是这样:
+
+
是二元运算符8
)推送到操作数堆栈(
,然后继续那么如何才能检测到+
缺少一个参数?如果你还更新维基百科,还有额外的荣誉: - )
答案 0 :(得分:5)
对于仅二进制运算符表达式,后缀表达式具有在表达式的任何前缀中的不变量,操作数的数量>运营商的数量,最后,这个差异恰好是一个。
因此,您可以通过维持操作数的运行计数 - 运算符的数量来验证RPN表达式在分流码的每个阶段的有效性。如果它低于1,或者最后变为多于1,则表示您有错误。
它没有查明错误,但至少让你知道有错误。
(注意:我没有尝试证明上述事实,但似乎它会起作用)
答案 1 :(得分:0)
您可以构建状态机。它可以发现出现问题的令牌。
当你开始阅读表达式时,需要一个前缀运算符或一个操作数。 如果您读取前缀运算符,则需要前缀运算符,操作数或左括号。
如果您读取操作数,则需要后缀或中缀运算符或右括号。
如果您阅读了后缀运算符expect和infix运算符或右括号。
如果您读取中缀运算符,则需要前缀运算符,操作数或左括号。
如果您阅读左括号,则需要前缀运算符,操作数或左括号。
如果您阅读右括号,则需要后缀或中缀运算符或右括号。
您可以轻松地将这些ifs转换为开关。 :)