我正在尝试从左到右评估字符串作为整数,数字在0-9之间,四个基本运算符(如"5+8+(8/4)"
)应评估为15
或"9+((3+4)*5)"
由于所有运算符具有相同的优先级,因此首先计算4 + 2,因为44
或"4+2*6"
为36,但我在实现括号时遇到了麻烦。
如果我不包含括号,我已设法让它工作。我通过在while循环中使用StringTokenizer解析字符串来实现此目的。每个令牌都存储在一个变量中,如果它包含一个数字,它就会被添加到一个堆栈中,如果它包含一个运算符,它就会被添加到一个堆栈中。然后,当Integer堆栈中有两个数字时,我会根据运算符堆栈中的运算符对它们进行评估。直到str.hasMoreTokens()
为真,并且while循环中断,它才会像整个字符串一样贯穿整个字符串。所以像8-5+7*3+1/2-4
这样的东西很完美,但我找不到一种方法来使括号与任何表达式一起使用
我尝试使用String newStr = str.replaceFirst("[^(]*(", "");
来尝试切断所有内容,包括第一个(
然后递归评估剩下的内容等等,但我认为这比它必须更复杂我无论如何都无法工作。我一直想着几个小时,但我想不出更简单的方法。
谢谢,我现在完全迷失了,所以任何指导/建议都会很棒。
答案 0 :(得分:2)
如果您希望以中缀表示法解析数学表达式,则需要实现分流码algorithm。没有看到你的代码,很难说什么丢失。
答案 1 :(得分:0)
如果您的项目的其他答案看起来太复杂,我建议您尝试在代码中集成Groovy脚本引擎。它可以轻松完成所有这些工作。
如果你需要像java代码一样快速地工作而不是自己解析表达式,它还允许你动态编译到java类。