我已经编写了Shunting yard
算法的实现。我用它将数学表达式从中缀转换为后缀(又称RPN)
(3 + 4) * (5 + 8) => 3 4 + 5 8 + *
我不发布任何代码,因为它与语言无关。它基本上使用与Wikipedia article中间发布的算法相同的算法。
这是问题所在:如果表达式已经是RPN,则什么也不会发生。
5 3 + => 5 3 +
与一元运算符相同:
10 NOT (input should be "NOT 10") => 10 NOT
在某些情况下这可能很有用,但在我的情况下我希望能够验证该表达式并通知用户该表达式的书写格式不正确。 我认为这种行为与编写实现的方式无关。如果您遵循Wikipedia页面上的算法,就会发生这种情况(AFAIK,RPN输入提供RPN输出)
Shunting yard算法可轻松用于查找不匹配的括号(如Wiki页中所述)。在处理运算符时,还可以轻松地发现缺少的内容(例如:(5 + ) * 3
无效)。
与Shunting yard相同,可以检测和阻止“无效”表达式,就像我在上面写的一样。如果没有,我可以使用哪种其他算法或技术来验证这些表达式?