您的位置 首页 java

java四则混合运算(2)

主要代码如下:

分割数字和操作符后

     /**
     * 分割数字和操作符,sin等
     * @param str
     * @return List
     * @throws Exception 
     */    public static List<String> getList(String str) throws Exception {
        List<String> list = new ArrayList<String>();
        FourBase fourBase = new FourBase();
        char[] char_arr = str.toCharArray();
        int start_index = 0, end_index = 0;
        String substr = "";//(-29.78)+((3-8*(6-4))*10.8+2*(4+6*3))*3-1*7+4/2
        for (int i = 0; i < char_arr.length; i++) {
            if (char_arr[i] == FourBase.leftkuohao ) {
                list.add(FourBase.leftkuohaoStr);
            } else if (char_arr[i] ==FourBase.rightkuohao) {
                list.add(FourBase.rightkuohaoStr);
            }else if(FourBase.isSanJiaoSZM(char_arr[i]))
            {
                String sin="";
                for(int j=0;j<4;j++)
                {
                    sin=sin+char_arr[i+j];
                }
                i=i+3;
                if(FourBase.isSanJiaoChar(sin))
                list.add( sin);
                else 
                {
                System.out.println("表达式中 三角函数 不正确:"+sin);
                System.out.println("系统退出");
                System.exit(0);
                }
                
            }
            else if (FourBase.isOperChar(char_arr[i]+"")) {
                list.add(char_arr[i] + "");
            } else if (fourBase.isNumChar(char_arr[i] + "")) {
                start_index = i;
                //i++;
                while (i < char_arr.length && FourBase.isNumChar(char_arr[i] + "")) {
                    i++;
                }
                end_index = i;
                i--;
                substr = str.substring(start_index, end_index);
                //System.out.println("end_index=" + i);
                //System.out.println(substr);
                //break;
                list.add(substr);
                //list.add(char_arr[i]);
            } else if (FourBase.isNumChar(char_arr[i + 1] + "") && char_arr[i] == '-') {
                start_index = i;
                i++;
                while (!FourBase.isOperChar(char_arr[i]+"") && i < char_arr.length) {
                    i++;
                }
                end_index = i;
                substr = str.substring(start_index, end_index);
                System.out.println("end_index=" + i);
                System.out.println(substr);
                //break;
                list.add(substr);
            }else if(char_arr[i] == ' ')
            continue;
            else
            {
            System.out.println("表达式含有不合规字母"+char_arr[i]);
            throw new  Runtime Exception();
            }
        }
        return list;
    }  

把负数的负号和数字连接起来,再去负数的括号

 /**
     * 把负数的负号和数字连接起来,再去负数的括号,例如把(, -, 29.78, )变成-29.78,方便用于计算
     * @param list
     * @return List
     */    public static List quFuNumKuohao(List list) {
        List list1 = new ArrayList<String>();
        for (int i = 0; i < list.size(); i++)
        {
            //-29.78
            //System.out.println(FourBase.isNumeric(list.get(i + 1).toString()));
            if(i==0&&list.get(i).toString().equals("-")&&FourBase.isNum(list.get(i+1).toString()))
            {
                list1.add(list.get(i).toString()+list.get(i+1).toString());
                i+=1;
            }else if(list.get(i).toString().equals(FourBase.leftkuohaoStr))
            {
                //(, -, 7,):(-7)
                if(list.get(i+1).toString().equals("-")&&FourBase.isNum(list.get(i+2).toString())&&list.get(i+3).toString().equals(FourBase.rightkuohaoStr))
                {
                    list1.add(list.get(i+1).toString()+list.get(i+2).toString());
                    i=i+3;
                }else if(list.get(i+1).toString().equals("-")&&FourBase.isNum(list.get(i+2).toString())&&FourBase.isOperChar(list.get(i+3).toString()))
                {//把负号和数字连接到一起,成为负数。(, -, 6, -, 4, ):(-6-4
                    list1.add(FourBase.leftkuohaoStr);
                    list1.add(list.get(i+1).toString()+list.get(i+2).toString());
                    list1.add(list.get(i+3).toString());
                    i=i+3;
                }else
                    list1.add(list.get(i).toString());
            }else
                list1.add(list.get(i).toString());
        }
        return list1;
    }  

计算乘除,sin,cos,括号中的单运算等

 /**
 * 计算乘除,sin,cos,括号中的单运算等。
 * @param list
 * @return
 */    public static List exec(List list) 
    {
        //list=getStr_Sin22(list);
        List list1 = new ArrayList<String>();
        List list11 = new ArrayList<String>();
        List list2 = new ArrayList<String>();
        Stack<String> vstack = new Stack<>();
        //Stack<String> operstack = new Stack<>();
        boolean flag = false;
        String st1 = "", st2 = "", st3 = "", st4 = "", st5 = "";
        double mm = 0.0;
        for (int i = 0; i < list.size(); i++)
        {
            st1=list.get(i).toString();
            vstack.push(st1);
            if(vstack.size()>=3)
            {
                st1=vstack.pop();
                st2=vstack.pop();
                st3=vstack.pop();
                //只计算乘除,3*7
                if(FourBase.isNum(st3)&&FourBase.isOperCC(st2)&&FourBase.isNum(st1))
                {
                    mm=FourBase.cal(st3,st2,st1);
                    System.out.println("计算乘除:"+st3+st2+st1+"="+mm);
                    vstack.push(mm+"");
                }else if(st3.equals(FourBase.leftkuohaoStr)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr))
                {// (, -27.0, ),去括号
                    System.out.println("去括号:"+st3+st2+st1+"="+st2);
                    vstack.push(st2+"");
                }else if(FourBase.isSanJiaoChar(st3)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr))
                {// sin(, -27.0, ),计算三角函数
                    double m1=FourBase.calSanjiao(st3,st2);
                    System.out.println("计算三角函数,例如sin()中的数"+st3+st2+st1+"="+m1);
                    vstack.push(m1+"");
                }else
                {
                    vstack.push(st3);
                    vstack.push(st2);
                    vstack.push(st1);
                }
            }
        }
        //System.out.println(valuestack);
        list1=FourBase.zhuanhuan(vstack);
        vstack.clear();
        //System.out.println(list1);
        System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list1));
        System.out.println("-----------------------");
        for (int i = 0; i < list1.size(); i++) {
            st1 = list1.get(i).toString();
            vstack.push(st1);
            if (vstack.size() >= 5) {
                st1 = vstack.pop();
                st2 = vstack.pop();
                st3 = vstack.pop();
                st4 = vstack.pop();
                st5 = vstack.pop();
                //三,(6*7),(6-7)
                if (st5.equals(FourBase.leftkuohaoStr) && FourBase.isNum(st4)&&FourBase.isOperChar(st3)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr)) {
                    mm = FourBase.cal(st4,st3, st2);
                    System.out.println("计算()中的单运算:" + st5 + st4 + st3 + st2 + st1 + "="+mm);
                    // valuestack .push(st4);
                    vstack.push(mm + "");
                }else if (FourBase.isSanJiaoChar(st5)&&FourBase.isNum(st4) && FourBase.isOperChar(st3)&&FourBase.isNum(st2)&& st1.equals(FourBase.rightkuohaoStr) )
                {
                    //sin(8-6)
                    mm=FourBase.calSanjiao(st5,FourBase.cal(st4,st3,st2));
                    //valuestack.push(st4);
                    System.out.println("计算三角函数中的单运算:"+st5+st4+st3+st2+st1+"="+mm);
                    vstack.push(mm+"");
                }
                else if ((st5.equals(FourBase.leftkuohaoStr)||FourBase.isSanJiaoChar(st5))&& FourBase.isNum(st4)&& FourBase.isOperJJ(st3)&&FourBase.isNum(st2)&&FourBase.isOperJJ(st1))
                {//(6-7-
                    mm = FourBase.cal(st4,st3, st2);
                    System.out.println("计算加减平级中的单运算:" + st4 + st3 + st2 + "="+mm);
                    //valuestack.push(st4);
                    vstack.push(st5 );
                    vstack.push(mm + "");
                    vstack.push(st1 );
                }else {
                    //System.out.println("===" + st4 + st3 + st2 + st1);
                    vstack.push(st5);
                    vstack.push(st4);
                    vstack.push(st3);
                    vstack.push(st2);
                    vstack.push(st1);
                }
            }
        }
        //System.out.println(valuestack);
        list2=FourBase.zhuanhuan(vstack);
        //System.out.println(list2);
        System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list2));
        System.out.println("-----------------------");
        //如果没有*,/,则返回
        if (!FourBase.isCunZaiCC(list2)) return list2;
        return exec(list2);
    }  

只计算平级加减

 /**
     * 只计算平级加减,例如(-29.78)+2833.8-(-130.9)-(-3.5249986574463286)
     * @param list
     * @return
     */    public static List execPingJiJiajian(List list)
    {
        List list1 = new ArrayList<String>();
        Stack<String> vstack = new Stack<>();
        String st1 = "", st2 = "", st3 = "";
        double mm=0;
        for (int i = 0; i < list.size(); i++)
        {
            st1 = list.get(i).toString();
            vstack.push(st1);
            if (vstack.size() >= 3)
            {
                st1 = vstack.pop();
                st2 = vstack.pop();
                st3 = vstack.pop();
                //-29.78, +, 2833.8
                if (FourBase.isNum(st3) && FourBase.isOperJJ(st2)&&FourBase.isNum(st1)) {
                    mm = FourBase.cal(st3,st2, st1);
                    System.out.println("计算加减:" + st3 + st2 + st1 + "="+mm);
                    vstack.push(mm + "");
                } else  {
                    vstack.push(st3);
                    vstack.push(st2);
                    vstack.push(st1);
                }
            }
        }
        //System.out.println(valuestack);
        list1=FourBase.zhuanhuan(vstack);
        System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list1));
        System.out.println("---------");
        if (list1.size()==1) return list1;
        return execPingJiJiajian(list1);
    }  

执行字符串表达式

 //执行字符串表达式
public static String exec(String str) throws Exception
    {
      try
      {
          System.out.println("分割数字和操作符后为:"+getList(str));
          List list22=quFuNumKuohao(getList(str));
          System.out.println("把负数的负号和数字连接起来,再去负数的括号:"+list22);
          System.out.println("-----------------------------");
          if(FourBase.checkStr(list22))
          {
          List list33=exec(list22);
          System.out.println("计算乘除和括号后为:"+list33);
          List list44=execPingJiJiajian(list33);
          System.out.println("计算加减和括号后为:"+list44);
          return list44.get(0).toString();
          }else
          return "表达式少左或者右括号,表达式不正确";
      }catch(Exception e)
      {
          throw new Exception("表达式不正确");
      }
    }
}  

MAIN方法调用

 public class MainCalc
{
    public static void main(String[] args) throws Exception{
        /**/       // String str = "1+(10+2*20)*3" ;
        //String str = "1+(10+2/20.0)*3-1*7" ;
          //String str="-29.78+((3-8*(6-4))*10.8+2*(4+6*3))*3-1*7+4/2";
        
         //String str = "-29.78+(3-8*(-6-4))*10.8";
    //String str = "((8))*sin(8-2*cos(6+5/4))*9/5-6*(7+2.36)";
        String str = "((-29.78))+ (( sin(3-8))*(-6-4))*10.8+2*(4+6.7*3)*3-1*(7+4)/2*(-7*((4-3/5)))-4*sin(6.7-2*cos(6-7/5+tan(7*3.1-3))+4-7)-7+50-5*(-3)";
    //String str="(sin(3))";
    System.out.println("要计算的字符串为:"+str);
         System.out.println("计算结果是:"+FourCalcSanJiao.exec(str));
    }
}  

主要结果和过程见上篇

2021-8-29

文章来源:智云一二三科技

文章标题:java四则混合运算(2)

文章地址:https://www.zhihuclub.com/196013.shtml

关于作者: 智云科技

热门文章

评论已关闭

1条评论

  1. Hello, you used to write magnificent, but the last few posts have been kinda boring… I miss your great writings. Past several posts are just a little bit out of track! come on!

网站地图