赋予括号优先权

时间:2013-01-01 22:48:59

标签: java calculator brackets operator-precedence

我是java的新手,我正在构建一个计算器,它采用一个等式并对其进行评估。

我正在使用Scanner方法获取输入,但这意味着我的输入是扫描仪类型。我应该怎么做这个输入,以便我可以评估它?一旦我可以评估它,我怎样才能优先考虑括号?

例如,对于等式(5 *(4 + 3))* 2,我想首先评估(4 + 3)的程序,然后将它乘以4,然后将所有这些乘以2 。

非常感谢。

3 个答案:

答案 0 :(得分:3)

你需要的是Dijkstra的Shunting Yard Algorithm。这会将in-fix数学符号转换为post-fix符号,它可以整齐地排除运算符优先级和括号的所有问题,因为post-fix符号不需要其中任何一个。维基百科页面在C中有一个完整的例子,可以翻译成Java。

答案 1 :(得分:1)

我认为这会有所帮助:Polish notationReverse Polish notation。他们解释了如何在树中划分字符串并一次执行一步的想法。

答案 2 :(得分:1)

@Simon G建议使用Dijkstra的Shunting Yard算法的建议已经确定了它。您需要实现“微语法”来解析符号,但Scanner可以完成95%的工作。

另一种方法是使用解析器生成器(如ANTLR或Javacc)实现表达式解析器,然后将求值实现为树的遍历。但如果你只是想要评估一次表达式,那那就相当重要了。

最后,我想指出,虽然这是一个众所周知的(已解决的)问题,但在任何语言中都不是一个微不足道的问题。也许这告诉你,你需要对算法和/或编译器做更多的阅读,以完善你的知识。