问题描述
小弟初学java,从网上找了一个四则运算的代码,发现有两个公式没法运行:(A/(B+C)-D)((A-B*C)/D)想请教下到底是什么原因,谢谢了!关于运算的程序如下:ackagecom.example.poker24;publicclassCalculate{privatestaticintintercePosition=0;//记录单个运算数据的长度privatestaticint[]intercePositionIndex=null;//记录“(”的下标privatestaticint[]intercePositionEnd=null;//记录“)”的下标publicstaticStringcalculate(Stringstr){//if(ispassString(str)==false){//return);returninterceResult(str);}//判断是否有带括号的运算字符串存在privatestaticStringinterceResult(Stringstr){Stringresult=str;char[]numberString=str.toCharArray();//1+2+(1*2+1-1*2+5)+2+(1+5+9+10-11)+1*5/2+3//1+8-9+(1*8/2-5+(1+2+8))+4/5*8/3*2intIndexStart=0;//记录“(”的实际数量intEndStart=0;//记录“)”的实际数量for(inti=0;i<numberString.length;i++){if('('==numberString[i]){//记录最后一个正括号的位置IndexStart=i;}if(')'==numberString[i]){//记录反括号的最初始下标的位置EndStart=i;//截取最里面一个括号里的运算字符串result=result.substring(IndexStart+1,EndStart);//截取括号的运算字符串进行运算,生成新的运算字符串result=str.substring(0,IndexStart)+interceptOperation(result,'*','/')+str.substring(EndStart+1,str.length());//回调执行,其它小括号的运算字符串returninterceResult(result);}if(i==numberString.length-1)if(EndStart==0)break;}//不存在括号了,再进行混合运算result=interceptOperation(str,'*','/');returnresult;}//不带括号的四则运算privatestaticStringinterceptOperation(StringoperationNumber,chara,charb){Stringmess=operationNumber;char[]stringOperation=mess.toCharArray();//循环遍历运算字符串,并做相应的运算for(inti=0;i<stringOperation.length;i++){//判断运算符所在的索引if(stringOperation[i]==a||stringOperation[i]==b){if(i!=0){//运算符前的第一个数doublenum1=interceptNumIndex(mess.substring(0,i));//记录第一个数据的长度intfrontPosition=intercePosition;//运算符前的第二个数doublenum2=interceptNumEnd(mess.substring(i+1,stringOperation.length));//记录第二个数据的长度intbackPosition=intercePosition;//算完乘除,将结果替换到原来运算的位置,得到新的运算字符串StringIndexMess=mess.substring(0,i-frontPosition+1);StringIndexResult="";//判断是否运算到最后的结果了if(IndexMess.indexOf('+')==-1&&IndexMess.indexOf('*')==-1&&IndexMess.indexOf('/')==-1&&IndexMess.lastIndexOf('-')==-1)IndexMess="";if(IndexMess!="")IndexResult=IndexMess.lastIndexOf('-')==IndexMess.length()-1?IndexMess.substring(0,i-frontPosition):IndexMess;//组装新的运算字符串mess=IndexResult//mess.substring(0,i-frontPosition+1)+reslutString(""+stringOperation[i],num1,num2)+mess.substring(i+backPosition+1);//0.111/1212/2/2/2/2/2/2/2if(mess.lastIndexOf('-')==0&&mess.indexOf('+')==-1&&mess.indexOf('*')==-1&&mess.indexOf('/')==-1){break;}//回调,继续运算returninterceptOperation(mess,a,b);//1+7-5+89/3+4-6*8/2+4-6}elsecontinue;}if(i==stringOperation.length-1){//递归出口,判断是否还有运算字符串在if(mess.indexOf('+')!=-1||mess.indexOf('-')!=-1)returninterceptOperation(mess,'+','-');break;}}returnmess;}//截取第二个数privatestaticdoubleinterceptNumEnd(Stringstr){doublea=0;intInrerceIndex=0;char[]stringOperation=str.toCharArray();booleanispas=false;//记录是否为负数for(inti=0;i<stringOperation.length;i++){switch(stringOperation[i]){case'*':case'/':case'+':case'-':InrerceIndex=i;if(i!=0)//判断该数是否为负数ispas=true;break;default:break;}if(ispas)break;}//判断此数据是否在运算字符串的最后一位if(InrerceIndex==0){a=Double.parseDouble(str);intercePosition=str.length();if(ispas)intercePosition++;}else{a=Double.parseDouble(str.substring(0,InrerceIndex));//记录数据的真实长度intercePosition=str.substring(0,InrerceIndex).length();}returna;}//截取第一个数privatestaticdoubleinterceptNumIndex(Stringstr){doublea=0;//记录数据intInrerceIndex=0;//记录运算符的位置booleantemp=false;//记录数据前运算符的状态char[]stringOperation=str.toCharArray();for(inti=stringOperation.length-1;i>=0;i--){switch(stringOperation[i]){case'*':case'/':case'+':case'-':InrerceIndex=i;temp=true;break;default:break;}if(temp)break;}//判断此数据是否在运算字符串的第一位if(InrerceIndex==0){a=Double.parseDouble(str);intercePosition=str.length();//if(temp)//intercePosition++;}else{a=Double.parseDouble(str.substring(InrerceIndex,str.length()));//记录数据的真实长度intercePosition=str.substring(InrerceIndex,str.length()).length();}returna;}//计算结果privatestaticdoublereslutString(Stringoperation,doublenum1,doublenum2){doublesumResult=0;if(operation.equals("*"))sumResult=num1*num2;if(operation.equals("-"))sumResult=num1-num2;if(operation.equals("/"))sumResult=num1/num2;if(operation.equals("+"))sumResult=num1+num2;returnsumResult;}//判断是否正确输入运算方式publicstaticbooleanispassString(StringmessString){booleanispass=false;booleanoperationIspass=true;//记录被除数的状态intai=0;//记录是否有运算符号的存在char[]IsString=messString.toCharArray();intnum1=0;intnum2=0;for(inti=0;i<IsString.length;i++){//记录有几对小括号的存在if('('==IsString[i])num1++;if(')'==IsString[i])num2++;//判断除数是否为零if('/'==IsString[i]&&IsString[i+1]=='0')operationIspass=false;//判断是否输入了运算符合if(IsString[i]=='+'||IsString[i]=='-'||IsString[i]=='*'||IsString[i]=='/')ai++;if(i==IsString.length-1)if(ai==0)num2++;}if(operationIspass)if(num1==num2)ispass=true;returnispass;}}
解决方案
解决方案二:
这么长....
解决方案三:
好复杂啊
解决方案四:
中缀转后缀,然后用栈进行运算