java语义计算器(一)混合四则运算

  简介:

           最近在做一个计算器,遇到了很多问题,也很有收获,一路从IO读写文档走来,感触很深。

 

   (一)java计算器之逆波兰表达式

            需要实现简单的加减乘除以及括号等,说道四则运算,就不得不说一下逆波兰表达式,这是一种有趣的后缀表达式,它将我们生活中常见的

二元计算式(中缀表达式,如1+2),转变为后缀表达式(12+),方便计算机识别和优化计算等。

          比如说    a+(b-c)*d ---> a,b,c,-,d,*,+

  逆波兰表达式推荐看看:

(1)Algorithm逆波兰表达式 java实现

        (2)  逆波兰表达式

      (3)java解析四则混合运算表达式并计算结果(具体实现)(栈和 逆波兰表达式实现

 

   (二)java计算器之不需要逆波兰表达式

             不过波兰这两个字怎么看都难看,不想要,介绍个没有用到逆波兰表达式的。

                  (0)java实现简单四则运算,可以处理括号和(-4)情况

                                 地址:http://blog.csdn.net/zmx729618/article/details/52328377

                  1java实现混合四则运算(采用栈和运算符优先级)

                   2JAVA实现简单四则混合运算(采用String.indexOf("+")substring()和递归来实现简单的加减乘除

                         源地址1http://www.oschina.net/code/snippet_189899_36597

                             转载地址2http://blog.csdn.net/su12345su/article/details/48491849

(三)测试改进等

         于是我采用了二.2中的算法,主要是看着简单,我将Float改成Double,因为有的数很大,比如说10000的阶乘什么的,就很难算。

          代码如下:

 /***
     * 主要是基本数据类型的带优先级的加减乘除的四则运算,
     * 调用 float opt(String s)就可以了
     * **/
    public static Double opt(String words) throws Exception{
        if(words == null || "".equals(words.trim())) {
            return 0.0;
        }
        int a1 = words.indexOf("+");
        // 寻找第一个加号
        int a2 = words.indexOf("-");
        int a3 = words.indexOf("*");
        int a4 = words.indexOf("/");
        int a5 = words.indexOf("(");
        if(a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1){
            if(words.trim() == null || "".equals(words.trim())){
                throw new Exception("operate error");
            }
            return Double.parseDouble(words.trim());
        }

        if(a5 != -1){
            int a6 = words.indexOf(")");
            if(a6 == -1){
                throw new Exception("括号不匹配");
            }else{
                Double f = opt(words.substring(a5 + 1, a6).trim());
                words = words.replace(words.substring(a5, a6 + 1), String.valueOf(f));
                return opt(words);
            }
        }

        if(a1 != -1){
            // 加上加号后面的
            return opt(words.substring(0, a1)) + opt(words.substring(a1 + 1, words.length()));
        }
        if(a2 != -1){
            // 减去减号后面的
            return opt(words.substring(0, a2)) - opt(words.substring(a2 + 1, words.length()));
        }
        if(a3 != -1){
            // 乘上乘号后面的
            return opt(words.substring(0, a3))*opt(words.substring(a3 + 1, words.length()));
        }
        if(a4 != -1){
            // 除以除号后面的
            return opt(words.substring(0, a4)) / opt(words.substring(a4 + 1, words.length()));
        }
        return Double.parseDouble(words.trim());
    }

希望对你有所帮助!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值