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

作者:sdr_zd 时间:2022-03-18 05:38:55 

在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上一篇写过)现在贴下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;
 }

来源:https://blog.csdn.net/sdr_zd/article/details/52135924

标签:java,计算器,核心,算法
0
投稿

猜你喜欢

  • C# 获取客户端IPv4地址的示例代码

    2022-09-12 12:39:34
  • 关于SpringBoot中controller参数校验的使用

    2023-02-24 04:24:10
  • 浅析Spring Boot中的spring-boot-load模块

    2023-11-23 02:39:31
  • AJAX SpringBoot 前后端数据交互的项目实现

    2023-11-24 05:49:48
  • C#游戏开发之实现华容道游戏

    2023-01-03 03:17:20
  • Java面向对象程序设计:继承,多态用法实例分析

    2021-08-03 06:54:04
  • Java List集合排序实现方法解析

    2023-01-06 05:40:14
  • Java Online Exam在线考试系统的实现

    2022-01-30 13:49:35
  • java中ResultSet遍历数据操作

    2022-06-13 05:02:13
  • springboot配置mysql数据库spring.datasource.url报错的解决

    2023-10-04 12:49:26
  • java二维数组基础知识详解

    2023-03-28 11:10:54
  • java 实现迷宫回溯算法示例详解

    2023-12-14 23:52:26
  • java中switch选择语句代码详解

    2023-09-28 19:34:29
  • springboot cloud使用eureka整合分布式事务组件Seata 的方法

    2023-08-19 13:49:44
  • SpringCloud @RefreshScope刷新机制浅析

    2022-12-13 11:38:15
  • SpringBoot如何用java生成静态html

    2023-08-08 08:46:59
  • 详解Java中如何正确书写单例模式

    2022-06-20 01:35:00
  • C#之WinForm跨线程访问控件实例

    2023-11-20 19:05:13
  • java判断字符串是否为数字的方法小结

    2023-11-25 05:54:52
  • sqlite数据库的介绍与java操作sqlite的实例讲解

    2023-05-09 03:07:40
  • asp之家 软件编程 m.aspxhome.com