java字符串表达式计算器_我的计算器, 用java实现的, 可以支持表达式计算

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();

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值