您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > JAVA写计算器小程序
/*本程序是一个计算器只能进行四则运算,当然也可以加上括号.由于时间有限没有图形界面。*但经过多次调试bug已经降为最少,如有bug纯属正常毕竟本人能力有限。*例如输入(5.2+6*2)/3*@anotherroysatm*本程序用到了中缀转后缀算法,及后缀计算。用栈和集合共同完成。*完成日期2015年5月11日共耗时两周时间。*本程序纯属原创,不得以任何方式作为商业用途,后果自负。*/packagetext;importjava.util.*;importjava.io.*;publicclassSamplenessStack{ArrayListlist=newArrayList();//创建动态数组list,用于存放输入的表达式及后面计算部分结果存放ArrayListrearlist=newArrayList();//创建动态数组rearlist,用于缓存括号内的计算结果Stackstack1=newStack();//创建栈stack1Stackstack2=newStack();//创建栈stack2/*创建内部类,没什么用(主要作者刚学完内部类,想学以致用),根据自己喜好,可以删除*/publicclassTestStack{privateinti=0,j=0,t=0,flag=0,flag_m=0;//创建一些变量后面需要使用privatedoublesum=0,f=0;publicintopratorPrior(charc)//判断运算符优先级{switch(c){case'(':return1;case')':return1;case'*':return2;case'/':return2;case'+':return3;case'-':return3;default:return-1;}}publicvoidstack()throwsIOException{Scannercin=newScanner(newBufferedInputStream(System.in));//扫描输入的表达式System.out.println(输入表达式:);Strings=cin.nextLine();/*把输入的表达式从String类型中的数字转换成double*/while(is.length()){if(s.charAt(i)='0'&&s.charAt(i)='9'||s.charAt(i)=='.')//判断是否为数字和小数点{if(s.charAt(i)!='.')sum=(s.charAt(i)-'0')+sum*10;//先全部转换成整数elsej=i;//标记小数点位置,方便后面统计数值(没有使用hashcode)t=0;f++;}if((s.charAt(i)'0'||s.charAt(i)'9')&&s.charAt(i)!='.'||s.length()-1==i){//判断四则运算符,和括号t++;if(t==1){if(s.length()-1==i)//这条if语句颇有意思,判断最后一个字符是不是‘)’{//如果不判断则可能导致自己输入的数经过String转换double存到list数组中顺序有变化。if(j!=0)//你输入的是(6+6)/9.2存到list数组可能变成(6+)6/9.2,可能还会产生别的变化。sum=sum/Math.pow(10,i-j);//转换成我们输入的数list.add(sum);//放入动态数组if(s.charAt(i)==')')//放入动态数组list.add(s.charAt(i));}else{if(j!=0)sum=sum/Math.pow(10,i-j-1);if(f!=0)list.add(sum);list.add(s.charAt(i));}}else{list.add(s.charAt(i));}j=0;sum=0;}i++;}/*在输入的表达式前面加上一对()方便后面计算使用*/list.add(')');list.add(0,'(');/*这个for语句很重要,有了这条for语句才能自由的使用负号例如-5*5-3或6+(-9),本程序负号和减号为同一符号*//*这个for语句的这几条if语句对应了所有由‘-’引起的bug。*/for(intd=0;dlist.size();d++){if(list.get(d).equals('-')&&list.get(d-1).equals('(')&&list.get(d+1).equals('(')){for(intr=0;rlist.size();r++)if(list.get(r).equals(')')){list.add(r,')');list.add(d,0);list.add(d,'(');break;}continue;}if(list.get(d).equals('-')&&list.get(d-1).equals('(')&&!list.get(d+1).equals(')')){list.add(d,0);list.add(d,'(');list.add(d+4,')');}if(list.get(d).equals('-')&&list.get(d-1).equals('(')&&list.get(d+1).equals(')'))list.add(d,0);}amongChangeRear();}publicvoidamongChangeRear()throwsIOException{for(inti=0;ilist.size();i++)//这个for循环把中缀表达式转后缀表达式和后缀表达式计算一起进行的,就是中缀转后缀和后缀计算同步的,{//这也是本程序与别人的不同之处,举个例子(3+(6+9*6)*2)本程序是这么转换的先把6+9*2转换成if(list.get(i).equals(')'))//后缀表达式692*+然后计算结果等于24,然后把24存入计算式就变成了(3+24)然后再接着计算....{ints=0;s=i;while(!list.get(s).equals('('))s--;for(intm=s+1;mi;m++){if(!list.get(m).toString().equals(*)&&!list.get(m).toString().equals(/)&&!list.get(m).toString().equals(+)&&!list.get(m).toString().equals(-)){rearlist.add(list.get(m));if(flag==1)rearlist.add(list.get(flag_m));flag=0;continue;}if(stack2.empty()){stack2.push(list.get(m));continue;}if(opratorPrior(list.get(m).toString().charAt(0))opratorPrior(stack2.peek().toString().charAt(0))){flag=1;flag_m=m;}else{rearlist.add(stack2.pop());stack2.push(list.get(m));}}while(i=s)//一组括号内表达式计算完后,把这组式子移除,否则重复计算这组表达式{list.remove(i);i--;}if(!stack2.empty())rearlist.add(stack2.pop());for(intn=0;nrearlist.size();n++)//用于计算表达式,用到了栈,用栈计算后缀表达式很方便{if(!rearlist.get(n).toString().equals(*)&&!rearlist.get(n).toString().equals(/)&&!rearlist.get(n).toString().equals(+)&&!rearlist.get(n).toString().equals(-))stack1.push(rearlist.get(n));else{doubleresult2=Double.parseDouble(stack1.pop().toString());//将String对象转换成double数值doubleresult1=Double.parseDouble(stack1.pop().toString());doubleresult=0;if(rearlist.get(n).toString().equals(*)){result=result1*result2;}if(rearlist.get(n).toString().equals(/)){result=result1/result2;}if(rearlist.get(n).toString().equals(+)){result=result1+result2;}if(rearlist.get(n).toString().equals(-)){result=result1-result2;}stack1.push(result);}}list.add(s,stack1.pop());rearlist.clear();//rearlist数组是重复多次调用的,为了不影响下次调用rearlist数组,所以每个括号里的表达式计算完后要把数组清空}}System.out.println(list.get(0));//完全计算后,list数组中就只有一个数,就是最后计算的结果,所以打印出结果。}}publicstaticvoidmain(Stringargs[]){try{SamplenessStack.TestStackt=newSamplenessStack().newTestStack();t.stack();}catch(Exceptione){System.out.println(请输入正确的表达式!!!);}}}
本文标题:JAVA写计算器小程序
链接地址:https://www.777doc.com/doc-2880727 .html