5

我对java很陌生,我正在构建一个计算器,它需要一个方程并对其进行评估。

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

例如,对于方程 (5*(4+3))*2 ,我希望程序先计算 (4+3),然后将其乘以 4,然后将所有乘以 2。

非常感谢。

4

3 回答 3

3

您需要的是 Dijkstra 的调车场算法。这将固定数学符号转换为后固定符号,它巧妙地解决了运算符优先级和括号的所有问题,因为后固定符号不需要它们中的任何一个。维基百科页面有一个完整的 C 语言示例,可以翻译成 Java。

于 2013-01-01T23:04:43.940 回答
1

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

于 2013-01-01T23:01:34.020 回答
1

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

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

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

于 2013-01-01T23:47:43.130 回答