Java计算器核心算法代码实现

 更新时间:2019年01月03日 14:56:25   作者:sdr_zd  
今天小编就为大家分享一篇关于Java计算器核心算法代码实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上一篇写过)现在贴下Java语言的代码实现。(学习Java时间不长所以可能会有很多不足的地方,我会改进也欢迎大神可以给我一些意见和建议~谢谢啦)

我将这部分分成三个方法完成功能,并在getResult方法调用(getResult方法被主方法调用)

private String getResult(String str) {
    //分割
    String[] Str = segment(str);
    //中缀转后缀
    String newStr = infToSuf(Str);
    //后缀计算
    String result = sufToRes(newStr);
    return sufToRes(result);
  }

1.字符串分割,为避免在TextView上显示带空格删除时不方便而且显示屏就那么大占地方,录入时的字符串中没有空格然后就手动分割了

private static String[] segment(String str) {
    String[] exp = new String[str.length()+1];
    //找最近的索引并截取字符串
    int l = str.length();
    for(int i = 0;i < l+1;i++) {
      int index;
      int[] ind = new int[6];
      ind[0] = str.indexOf('+');
      ind[1] = str.indexOf('-');
      ind[2] = str.indexOf('*');
      ind[3] = str.indexOf('/');
      ind[4] = str.indexOf('(');
      ind[5] = str.indexOf(')');
      if(ind[1] == 0) {
        Arrays.sort(ind);
        int t;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        int r = ind[t+1];
        exp[i] = str.substring(0,r);
        i++;
        exp[i] = str.substring(r,r+1);
        str = str.substring(r+1);
      }else if(((ind[1]-ind[4]) == 1) && (ind[4]==0)) {
        Arrays.sort(ind);
        int t ;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        int r = ind[t+1];
        exp[i] = str.substring(0,1);
        i++;
        exp[i] = str.substring(1,r+2);
        i++;
        exp[i] = str.substring(r+2,r+3);
        str = str.substring(r+3);
      }else {
        Arrays.sort(ind);
        int t;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        if(t==6)
          break;
        index = ind[t];
        if(index!=0) {
          exp[i] = str.substring(0,index);
          i++;
        }
        exp[i] = str.substring(index,index+1);
        str = str.substring(index+1);
      }
    }
    int j = 0;
    int k = 0;
    for(; exp[j]!=null ;j++){}
    if(!exp[j-1].equals(")")) {
      exp[j]=str;
      str = "";
      k = j;
    }else {
      k = j-1;
    }
    String[] expp = new String[k+1];
    for(int t = 0; t < k+1;t++) {
      expp[t] = exp[t];
    }
    return expp;
    //System.out.println("分割的字符串:");
  }

2.中缀转后缀

private static String infToSuf(String[] exp) {
    String newStrs = "";
    //初始化栈
    Stack<String> stack = new Stack<>();
     /*
           判断并放入后缀表达式中:
       for循环遍历整个str进行判断
           循环结束若栈不为空全部出栈
     */
    int l = exp.length;
    for(int i = 0; i < l; i++) {
      if ((stack.empty()) && (exp[i].equals("+") || exp[i].equals("-") || exp[i].equals("*") || exp[i].equals("/"))) {
        stack.push(exp[i]);
      } else if (exp[i].equals("(")) {
        stack.push(exp[i]);
      } else if (exp[i].equals("*") || exp[i].equals("/")) {
        while (stack.peek().equals("*") || stack.peek().equals("/")) {
          newStrs = newStrs.concat(stack.pop()+" ");
          if(stack.isEmpty()) {
            break;
          }
        }
        stack.push(exp[i]);
      } else if (exp[i].equals("+") || exp[i].equals("-")) {
        while (!(stack.isEmpty())&&((stack.peek()).equals("*") || (stack.peek()).equals("/") || (stack.peek()).equals("+") || (stack.peek()).equals("-"))) {
          newStrs = newStrs.concat(stack.pop()+" ");
          if(stack.isEmpty()) {
            break;
          }
        }
        stack.push(exp[i]);
      } else if (exp[i].equals(")")) {
        int t = stack.search("(");
        for (int k = 1; k < t; k++) {
          newStrs = newStrs.concat(stack.pop()+" ");
        }
        String tstr = stack.pop();
      } else {
        newStrs = newStrs.concat(exp[i]+ " ");
      }
    }
    while (!stack.empty()) {
      if (!stack.peek().equals("(") || !stack.peek().equals(")")) {
        newStrs = newStrs.concat(stack.pop()+" ");
      } else if (stack.peek().equals("(") || stack.peek().equals(")")) {
        String tstr = stack.pop();
      }
    }
//   System.out.println("后缀:"+newStrs);
    return newStrs;
  }

3.后缀的计算

  private static String sufToRes(String sufStr) {
    String[] exp = sufStr.split(" ");
    Stack<String> stack = new Stack<>();
    String Res = "";
    for(int i = 0;i < exp.length; i++) {
      if(!exp[i].equals("+") && !exp[i].equals("-") && !exp[i].equals("*") && !exp[i].equals("/")){
        stack.push(exp[i]);
      }else if(exp[i].equals("+")) {
        BigDecimal b2 = new BigDecimal(stack.pop());
        BigDecimal b1 = new BigDecimal(stack.pop());
        BigDecimal b3 = b1.add(b2);
        stack.push(b3.toString());
      }else if(exp[i].equals("-")) {
        BigDecimal b2 = new BigDecimal(stack.pop());
        BigDecimal b1 = new BigDecimal(stack.pop());
        BigDecimal b3 = b1.subtract(b2);
        stack.push(b3.toString());
      }else if(exp[i].equals("*")) {
        BigDecimal b2 = new BigDecimal(stack.pop());
        BigDecimal b1 = new BigDecimal(stack.pop());
        BigDecimal b3 = new BigDecimal(0);
        if(b1.compareTo(BigDecimal.ZERO)== 0|| b2.compareTo(BigDecimal.ZERO) == 0) {
          b3 = BigDecimal.ZERO;
        }else {
          b3 = b1.multiply(b2);
        }
        stack.push(b3.toString());
      }else if(exp[i].equals("/")){
        BigDecimal b2 = new BigDecimal(stack.pop());
        BigDecimal b1 = new BigDecimal(stack.pop());
        BigDecimal b3 = new BigDecimal(0);
        double d1 = b1.doubleValue();
        double d2 = b2.doubleValue();
        if(d1%d2 == 0){
          b3 = (b1.divide(b2));
          stack.push(b3.toString());
        }else {
          b3 = b1.divide(b2,10, RoundingMode.HALF_UP);
          stack.push(b3.toString());
        }
      }
    }
    Res = stack.pop();
    boolean flag = false;
    for (int m = 0; m < Res.length() - 1;m++) {
      if(Res.charAt(m) == '.'){
        flag = true;
      }
    }
    if(flag) {
      for(int m = Res.length()-1;m >= 0;m--) {
        if(Res.charAt(m) == '0'){
        }else {
          Res = Res.substring(0,m+1);
          break;
        }
      }
      if(Res.charAt(Res.length()-1) == '.') {
        Res = Res.substring(0,Res.length()-1);
      }
    }
    return Res;
  }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java源码解析HashMap成员变量

    Java源码解析HashMap成员变量

    今天小编就为大家分享一篇关于Java源码解析HashMap成员变量,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java string 转date方法如何实现

    java string 转date方法如何实现

    在开发应用中经常会使用到java string 转date这种不是很常见的做法,本文将以此问题提供详细解决方案,需要了解的朋友可以参考下
    2012-11-11
  • Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解

    这篇文章主要介绍了Java线程池FutureTask实现原理详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java实现图片切割功能

    Java实现图片切割功能

    这篇文章主要为大家详细介绍了Java实现图片切割功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • sms4j 2.0 全新来袭功能的调整及maven变化详解

    sms4j 2.0 全新来袭功能的调整及maven变化详解

    这篇文章主要介绍了sms4j 2.0 全新来袭功能的调整及maven变化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java  中桥接模式——对象结构型模式的实例详解

    Java 中桥接模式——对象结构型模式的实例详解

    这篇文章主要介绍了Java 中桥接模式——对象结构型模式的实例详解的相关资料,希望通过本文大家能掌握这部分知识,需要的朋友可以参考下
    2017-09-09
  • SpringBoot请求发送与信息响应匹配实现方法介绍

    SpringBoot请求发送与信息响应匹配实现方法介绍

    这篇文章主要介绍了SpringBoot请求发送与信息响应匹配实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • SpringBoot整合Netty实现WebSocket的示例代码

    SpringBoot整合Netty实现WebSocket的示例代码

    本文主要介绍了SpringBoot整合Netty实现WebSocket的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Arrays.sort如何实现降序排序

    Arrays.sort如何实现降序排序

    这篇文章主要介绍了Arrays.sort如何实现降序排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring security获取用户信息的实现代码

    spring security获取用户信息的实现代码

    这篇文章主要介绍了spring security获取用户信息的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论