我对java很陌生,我正在构建一个计算器,它需要一个方程并对其进行评估。
我正在使用 Scanner 方法来获取输入,但这意味着我的输入是 Scanner 类型。我应该如何处理这个输入,以便我可以评估它?一旦我可以评估它,我怎么能优先考虑括号?
例如,对于方程 (5*(4+3))*2 ,我希望程序先计算 (4+3),然后将其乘以 4,然后将所有乘以 2。
非常感谢。
我对java很陌生,我正在构建一个计算器,它需要一个方程并对其进行评估。
我正在使用 Scanner 方法来获取输入,但这意味着我的输入是 Scanner 类型。我应该如何处理这个输入,以便我可以评估它?一旦我可以评估它,我怎么能优先考虑括号?
例如,对于方程 (5*(4+3))*2 ,我希望程序先计算 (4+3),然后将其乘以 4,然后将所有乘以 2。
非常感谢。
您需要的是 Dijkstra 的调车场算法。这将固定数学符号转换为后固定符号,它巧妙地解决了运算符优先级和括号的所有问题,因为后固定符号不需要它们中的任何一个。维基百科页面有一个完整的 C 语言示例,可以翻译成 Java。
我认为这会有所帮助:Polish notation和Reverse Polish notation。他们解释了如何在树中划分字符串并一次执行一个步骤的想法。
@Simon G 提出的使用 Dijkstra 的 Shutting Yard 算法的建议已经确定了。您将需要实现“微语法”来解析符号,但Scanner
可以完成 95% 的工作。
另一种方法是使用解析器生成器(如 ANTLR 或 Javacc)实现表达式解析器,然后将求值实现为树的遍历。但是,如果您只想评估一次表达式,那将是相当重量级的。
最后,我想指出,虽然这是一个众所周知(已解决)的问题,但它不是一个微不足道的问题......在任何语言中。也许这告诉您,您需要对算法和/或编译器进行更多阅读以完善您的知识。