我将制作一个可以分析代数表达式的程序。
例如:
<?php
echo cal ('5*5+2*2');
?>
我的程序会知道它会先将 5 与 5 相乘,然后将 2 与 2 相乘,然后再将它们相加。我想自己分析它,而不是通过php。
问问题
611 次
2 回答
1
我打算建议你看看递归下降解析器,但显然自从我上次在 1980 年代中期这样做以来,事情已经发生了变化。如果您想了解这一切背后的理论,那么解析表达式语法似乎是您现在要走的路。
如果您不太关心该理论,那没关系:实现该理论意味着无论如何您最终都会编写递归下降解析器,因此您可以这样做:-)
于 2010-11-21T05:57:22.683 回答
0
您可以采用“中缀”表达式并使用堆栈,将其转换为“前缀”或“后缀”表达式来决定操作顺序(括号、求幂、乘法或除法、加法或减法)。
例如,表达式 ([5][ * ][5][ + ][2][ * ][2]) 将被转换为后缀表达式 [5][5][ * ][2][2][ *][+]。这个“后缀”表达式现在可以读作“五和五相乘,二和二相乘,然后相加”,这将保留运算顺序。
考虑“前缀/后缀”想法的另一种方法是多个堆栈。当您遇到数字 5 时,将其推入主堆栈。当您遇到乘法符号时,将其存储在辅助堆栈中。当您到达下一个 5 时,将其推入主堆栈,然后从辅助堆栈中弹出所有项目并将它们推入主堆栈。
一旦您拥有正确顺序的运算符和操作数,就可以将项目从堆栈中弹出然后评估它们。
我记得我在大学的计算机科学 102 课程中发现了这个问题。你这样做是为了好玩,还是只是想弄清楚?
于 2010-11-21T06:04:16.957 回答