计算器核心算法(二)

前面呢,我们实现了没有括号的混合运算,现在我们需要解决混合运算的等式中有多重的括号的等式,其实这个问题换一个角度想其实非常简单的,来,北鼻,跟着我一起......

回归正题。。。

其实吧,你要实现有多层括号的,比如"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);
    }



评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值