packagecross.pauliuyou.calculator.base;importjava.math.BigDecimal;importjava.math.BigInteger;importjava.math.MathContext;importjava.util.Vector;/***
*@author刘优
*@version1.1
*
*
*
**/publicclassCalculateUnit {
Vectornumbers;
Vectoroperators;publicCalculateUnit(Vectornums,Vectorops) {
numbers=nums;
operators=ops;intj=0;for(inti=0; i
numbers.add(i+j,numbers.get(i+j));
j++; } } }publicBigDecimal calculate()throwsCalculateException {int[] levels=newint[operators.size()];for(inti=0; i
levels[i]=i;
}
sort(levels,operators);for(inti=0; i=0; j--) {chartm=operators.get(j);if(tm!='0') {
move=false;
}else{if(!move) {
nullPos=j;
}
nullNum++;
}
}if(nullPos!=-1&&move) {
numPos=nullPos;
}else{
numPos-=nullNum;
}intobjnum=this.getOpObjNum(op);switch(objnum) {case1:case2:
BigDecimal left=numbers.get(numPos);
BigDecimal right=numbers.get(numPos+1);
BigDecimal rs=cal(left,right,op);
numbers.remove(numPos+1);
numbers.remove(numPos);
numbers.add(numPos,rs);
operators.remove(opPos);
operators.add(opPos,'0');break;case3:default:break;
}
}returnnumbers.get(0);
}protectedstaticBigDecimal jie(BigDecimal x)throwsCalculateException {if(x.compareTo(BigDecimal.ZERO)==-1||x.toString().indexOf(".")!=-1) {thrownewCalculateException("负数或小数不允许算阶乘");
}
BigInteger result=BigInteger.ONE;
BigInteger num=newBigInteger(x.intValue()+"");while(num.compareTo(BigInteger.ONE)==1) {
result=result.multiply(num);
num=num.subtract(BigInteger.ONE);
}returnnewBigDecimal(result);
}privatestaticBigDecimal sqrt(BigDecimal x)throwsCalculateException {if(x.compareTo(BigDecimal.ZERO)==-1) {thrownewCalculateException("负数不能开平方");
}returnnewBigDecimal(Math.sqrt(x.doubleValue())+"");
}publicstaticBigDecimal cal(BigDecimal x,BigDecimal y,charop)throwsCalculateException {//System.out.println("cal : " + x + op + y);switch(op) {case'+':returnx.add(y);case'-':returnx.subtract(y);case'*':returnx.multiply(y);case'/':if(y.compareTo(BigDecimal.ZERO)==0) {thrownewCalculateException("不允许除零!");
}returnx.divide(y,MathContext.DECIMAL64);case'!':returnjie(x);case's':returnsqrt(x);case'p':returnx.pow(y.intValue());default:thrownewCalculateException("不支持的运算符 :"+op);
}
}privateintgetOpObjNum(charc) {if(c=='!'||c=='s') {return1;
}if(c=='p') {return2;
}if(c=='*'||c=='/') {return2;
}if(c=='+'||c=='-') {return2;
}return0;
}privateintgetLevel(charc) {if(c=='p') {return70;
}elseif(c=='!'||c=='s') {return60;
}elseif(c=='/') {return50;
}elseif(c=='*') {return49;
}elseif(c=='-') {return40;
}elseif(c=='+') {return39;
}return0;
}privatevoidsort(int[] in,Vectorops) {for(inti=0; it) {
t=t2;
pos=j;
}
}if(pos!=i) {intttt=in[i];
in[i]=in[pos];
in[pos]=ttt;
}
}
}publicdoubleoldCalculate(Vectornumbers,Vectoroperators)throwsCalculateException {
BigDecimal d=null;while(operators.size()>0) {for(inti=0; i
d=cal(numbers.get(i),numbers.get(i+1),c);
numbers.remove(i+1);
numbers.remove(i);
numbers.add(i,d);
operators.remove(i);break;
}booleanhasMutli=false;for(intj=i+1; j
hasMutli=true;break;
}
}if(!hasMutli) {
d=cal(numbers.get(i),numbers.get(i+1),operators.get(i));
numbers.remove(i+1);
numbers.remove(i);
numbers.add(i,d);
operators.remove(i);break;
}
}
}returnnumbers.get(0).doubleValue();
}publicString toString() {return"num :"+numbers.toString()+"\nops :"+operators.toString();
}
}