我是java的新手,我正在构建一个计算器,它采用一个等式并对其进行评估。
我正在使用Scanner方法获取输入,但这意味着我的输入是扫描仪类型。我应该怎么做这个输入,以便我可以评估它?一旦我可以评估它,我怎样才能优先考虑括号?
例如,对于等式(5 *(4 + 3))* 2,我想首先评估(4 + 3)的程序,然后将它乘以4,然后将所有这些乘以2 。
非常感谢。
答案 0 :(得分:3)
你需要的是Dijkstra的Shunting Yard Algorithm。这会将in-fix数学符号转换为post-fix符号,它可以整齐地排除运算符优先级和括号的所有问题,因为post-fix符号不需要其中任何一个。维基百科页面在C中有一个完整的例子,可以翻译成Java。
答案 1 :(得分:1)
我认为这会有所帮助:Polish notation和Reverse Polish notation。他们解释了如何在树中划分字符串并一次执行一步的想法。
答案 2 :(得分:1)
Scanner
可以完成95%的工作。
另一种方法是使用解析器生成器(如ANTLR或Javacc)实现表达式解析器,然后将求值实现为树的遍历。但如果你只是想要评估一次表达式,那那就相当重要了。
最后,我想指出,虽然这是一个众所周知的(已解决的)问题,但在任何语言中都不是一个微不足道的问题。也许这告诉你,你需要对算法和/或编译器做更多的阅读,以完善你的知识。