自己写的一个解析运算式并得到结果的方法(最后是以Double型表示,中间是以BigDecimal计算中间结果的,临时起意写的,没有注释)

 

package calcutor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Calcutor{

 public static BigDecimal getResult(ArrayList<String> list){
  if(list.size() == 3){

   if("+".equals(list.get(2))){
    return new BigDecimal(list.get(0)).add(new BigDecimal(list.get(1)));
   }else if("-".equals(list.get(2))){
    return new BigDecimal(list.get(0)).subtract(new BigDecimal(list.get(1)));

   }else if("*".equals(list.get(2))){
    return new BigDecimal(list.get(0)).multiply(new BigDecimal(list.get(1)));
   }else if("/".equals(list.get(2))){
    return new BigDecimal(list.get(0)).divide(new BigDecimal(list.get(1)),1000,BigDecimal.ROUND_UP);

   }else if("^".equals(list.get(2))){
    return new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));
   }
  }

  ArrayList<String> list1 = new ArrayList<String>();

  for(int i = 0;i<list.size();i++) {

   if(PriorityEnum.getEnumList().contains(list.get(i))){
    list1.addAll(list.subList(0, i-2));
    String s = "";
    if("+".equals(list.get(i))){

     s = new BigDecimal(list.get(i-2)).add(new BigDecimal(list.get(i-1))).toString();


    }else if("-".equals(list.get(i))){
     s = new BigDecimal(list.get(i-2)).subtract(new BigDecimal(list.get(i-1))).toString();

    }else if("*".equals(list.get(i))){
     s = new BigDecimal(list.get(i-2)).multiply(new BigDecimal(list.get(i-1))).toString();
    }else if("/".equals(list.get(i))){
     s = new BigDecimal(list.get(i-2)).divide(new BigDecimal(list.get(i-1)),1000,BigDecimal.ROUND_UP).toString();

    }else if("^".equals(list.get(i))){
     s = "" + new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));

    }
    list1.add(s);
    list1.addAll(list.subList(i+1, list.size()));
    list = null;
    return getResult(list1);
   }
  }
  return BigDecimal.ZERO;
 }

 public static ArrayList<String> readFormula(String formula){

  ArrayList<String> list1 = new ArrayList<String>();
  ArrayList<String> list2 = new ArrayList<String>();
  String s = "";

  for(int i = 0; i< formula.length() ;i++){
   if(!isC(formula.charAt(i))){
    list1.add(s);
    list1.add(""+formula.charAt(i));
    s = "";
   }  else {
    s += formula.charAt(i);
   }
  }

  if(s != null && s.length() != 0){list1.add(s);}

  for (String string : list1) {
   if(string != null && string.length() != 0){list2.add(string);}
  }
  list2.trimToSize();
  return list2;
 }

 public static boolean isNumber(String target){
  if(target == null || target.length() == 0){
   return false;
  }

  Pattern pattern =
   Pattern.compile("[0-9]+\\.?[0-9]*");
  Matcher matcher = pattern.matcher(target);
  return matcher.matches();
 }

 public static boolean isC(char c){

  String target = ""+c;

  if(target == null || target.length() == 0){
   return false;
  }

  Pattern pattern =
   Pattern.compile("[0-9]?\\.?");
  Matcher matcher = pattern.matcher(target);
  return matcher.matches();
 }

 public static ArrayList<String> sort(ArrayList<String> list){

  ArrayList<String> list1 = new ArrayList<String>();
  ArrayList<String> list2 = new ArrayList<String>();
  list1.add("#");
  list.add("#");
  for (String str : list) {
   if(isNumber(str)){
    list2.add(str);
   } else{
    if(")".equals(str)){
     while(list1.size() > 0){
      if("(".equals(list1.get(list1.size()-1))){
       list1.remove(list1.size()-1);
       break;
      }
      list2.add(list1.get(list1.size()-1));
      list1.remove(list1.size()-1);
     }

    } else{
     if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
      list1.add(str);
     }else{

      while(list1.size() > 0){
       if(PriorityEnum.getIcp(str) < PriorityEnum.getIsp(list1.get(list1.size()-1))){
        if(!")".equals(list1.get(list1.size()-1)) && !"(".equals(list1.get(list1.size()-1)) && !"#".equals(list1.get(list1.size()-1))){
         list2.add(list1.get(list1.size()-1));
        }
        list1.remove(list1.size()-1);
       } else {
        break;
       }
      }
      if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
       list1.add(str);
      }
     }
    }
   }

  }

  list1 = null;
  list2.trimToSize();
  return list2;
 }


}

 

 

package calcutor;

import java.util.ArrayList;

public enum PriorityEnum {


 First("#", 0, 0)

 ,Left("(", 8,1)

 ,Right(")", 1,8)
 ,Divide("/",4,5)
 ,Multi("*",4,5)
 ,Mul("%",4,5)
 ,Head("^",6,7)
 ,Plus("+",2,3)
 ,Minus("-",2,3);


 private final String param;


 private final int icp;


 private final int isp;


 private PriorityEnum(String param, int icp, int isp) {
  this.param = param;
  this.icp = icp;
  this.isp = isp;
 }


 @Override
 public String toString() {
  return this.param;
 }


 public String getParam() {
  return this.param;
 }


 public static int getIcp(String param) {
  for (PriorityEnum v : values()) {
   if(v.getParam().equals(param)){
    return v.icp;
   }
  }
  return 0;
 }
 public static int getIsp(String param) {
  for (PriorityEnum v : values()) {
   if(v.getParam().equals(param)){
    return v.isp;
   }
  }
  return 0;
 }
 public static ArrayList<String> getEnumList(){
  ArrayList<String> list = new ArrayList<String>();
  for (PriorityEnum v : values()) {
   list.add(v.getParam());
  }
  list.trimToSize();
  return list;
 }
}

 

package calcutor;

import java.util.ArrayList;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {

  Scanner sc = new Scanner(System.in);
  String s = sc.nextLine();
  //String s = "11+12*(13-14)-15/16*(12+1.5*(3+5.2))";
  //String s = "12.6 + 13.5*6";
  s =s .replace(" ", "");
  ArrayList<String> list = Calcutor.readFormula(s);
  ArrayList<String> list1 = Calcutor.sort(list);
  for (String string : list1) {
   System.out.print(string+" ");
  }
  System.out.println();
  System.out.println(Calcutor.getResult(list1).doubleValue());
  double a = 1*13*15*(5+9)*(12.0/9+9*(3+5));
  System.out.println(12^14);
  System.out.println(a);
}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值