通常,评估中缀数学表达式的程序使用 Shunting Yard Algorithm 的某些变体来首先将表达式转换为 Reverse Polish Notation ,然后评估反向波兰表示法以获得单个最终值。
我的问题是,是否存在绕过INFIX的一些众所周知的算法 - > RPN步骤,只是使用某种递归下降解析来评估初始的 infix 表达式?
据推测,在编写编译器或解析器来翻译INFIX时可能会有用 - > RPN。 RPN是一种"编译形式"表达式(AST),可以通过计算机使用简单的输出堆栈更容易地进行评估。但是,如果您只是编写将中缀表达式立即转换为数字输出值的代码,则可能没有任何用于缓存中间RPN表单的用法。
那么,有没有任何众所周知的解析中缀表达式的算法而不首先转换为RPN?或者转换为RPN通常比任何其他方法更有效?
答案 0 :(得分:4)
您可以轻松修改分流码算法,以便在您前进时立即评估表达式,而不是构建RPN表示。具体来说,每当您通常从堆栈中弹出一个运算符和两个操作数时,而不是将这些标记附加到输出,而只是计算表达式并将结果推回操作数堆栈。最后,在最后,通过弹出两个操作数,弹出一个操作符,计算结果并将其推回堆栈来评估运算符和操作数堆栈所隐含的表达式。
例如,要评估3 * 4 + 2,您需要执行以下操作:
Process 3:
Operators
Operands 3
Process *:
Operators *
Operands 3
Process 4:
Operators *
Operands 3 4
Process +:
Operators +
Operands 12
Process 2:
Operators +
Operands 12 2
End of input:
Operators
Operands 14
希望这有帮助!