前面呢,我们实现了没有括号的混合运算,现在我们需要解决混合运算的等式中有多重的括号的等式,其实这个问题换一个角度想其实非常简单的,来,北鼻,跟着我一起......
回归正题。。。
其实吧,你要实现有多层括号的,比如"2*3+5*(2+3*3)" 比如这样子的等式,括号里面的等式需要优先计算这是常识,你会发现在这个等式中,其实括号中的字符串 "2+3+3"你是能计算的,这就是上一篇讲解的,其实无非你就是把括号里面的没有括号的等式先计算出来
说白了就是把"(2+3*3)"替换成"11" 思路明白了吧?就是把最里面的一对括号里面的内容先计算,然后计算结果替换那对括号.好,开工!
第一步:找到最里面的一对括号
为什么要找到最里面的一对括号呢,原先我们能计算除了括号的混合运算,现在加了括号,原先的parse方法又不认识了,parse方法只认识没有括号的,所以这里你要做的工作就是找到括号,然后计算括号里面的字符串,然后替换括号的位置
1.找到最里面的那一对括号 "(2+6-(2*2+1)) + (2*2+5)" 对于这个字符串最里面的括号就是"(2*2+1)" 因为这对括号里面已经没有括号了,所以我们找的就是这样子的括号
2.计算括号里面的字符串,然后完成替换
在parse方法的最前面加了一层判断,也就是代码如果走到这个判断下面了,就代表这个等式已经没有括号了,因为有括号就在if语句里面直接返回了
还是拿上面的"(2+6-(2*2+1)) + (2*2+5)"为例,找到的最里面的一对括号为"(2*2+1)"
对里面的数据进行计算,替换原来的位置,也就是"(2+6-" "5" ") + (2*2+5)"
这三个字符串进行拼接,也就是-->"(2+6-5) + (2*2+5)",然后又调用自己,又有括号,又替换括号部分.....最后结果duang的一下就出来,这是特技!请不要相信!!!
最后奉上计算结果图:
到这里计算器的核心代码已经写完,如果你喜欢,就请关注我吧,我是小金子,菜鸟也要飞哦,我是菜鸟,让我们一起飞吧
附上完整parse方法源代码
/**
* 实现混合运算
*
* @param content
* @return
*/
public static double parse(String content) {
// 找到字符串中最后一个左括号
int startIndex = content.lastIndexOf("(");
// 如果不是-1,标识这个等式中有括号,继续找与之对应的右括号
if (startIndex != -1) {
// 从左括号的位置开始找,找到第一个右括号,这对括号里面一定没有括号,所以就可以交给写好的parse(Stringcontent)方法算出结果!
int endIndex = content.indexOf(")", startIndex);
double d = parse(content.substring(startIndex + 1, endIndex));
return parse(content.substring(0, startIndex) //
+ d + content.substring(endIndex + 1));
}
int index = content.indexOf("+");
if (index != -1) {
return parse(content.substring(0, index)) + parse(content.substring(index + 1));
}
// 这里<---
index = content.lastIndexOf("-");
if (index != -1) {
return parse(content.substring(0, index)) - parse(content.substring(index + 1));
}
// 这里<---
index = content.indexOf("*");
if (index != -1) {
return parse(content.substring(0, index)) * parse(content.substring(index + 1));
}
// 这里<---
index = content.lastIndexOf("/");
if (index != -1) {
return parse(content.substring(0, index)) / parse(content.substring(index + 1));
}
return Double.parseDouble(content);
}