欢迎来到天天文库
浏览记录
ID:38158253
大小:15.98 KB
页数:6页
时间:2019-06-06
《Java计算器实现(逆波兰式)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、packagehfw.util;importjava.util.ArrayDeque;importjava.util.Deque;/****逆波兰式*总结,java版的Eval:逆波兰和动态编译,推荐用动态编译,因为逆波兰式不认识"-4",只认识"-4"*@authorzyh*/publicclassRNP{/***运算数*/privatestaticDequeoperationNum=newArrayDeque();/***运算符*/privatestaticDequeoperator=newArray
2、Deque();/***将表达式转换为逆波兰式*@paramexpression*@return*/privatestaticvoidstr2Rnp(Stringexpression){operationNum.clear();operator.clear();intindex=0;for(inti=0;i3、4、c=='('5、6、c==')'){//操作数直接入栈StringoperationNum=ex7、pression.substring(index,i);//区分负号和减号,如果'-'前面的一个是+-*/(认为是负号,'-'前面的是数或)认为是减号if(c=='-'){intin=i;while((expression.charAt(in-1))==''){in--;if(in==0){break;}}if(in==0){continue;}Stringprevious=expression.substring(in-1,i);if(isOperator(previous.charAt(0))8、9、previous.charAt(0)=='('){c10、ontinue;}}if(operationNum.trim().length()>0){RNP.operationNum.push(operationNum.trim());}index=i+1;Stringoperator=c+"";//如果操作符是'(',直接入栈if('('==c){RNP.operator.push(operator);//如果操作符是')',将'('操作符之后的全部出栈,入栈操作数,'('')'舍弃}elseif(')'==c){while(true){Stringo=RNP.operator.pollFirst();if(11、o==null12、13、"(".equals(o)){break;}RNP.operationNum.push(o);}//如果操作符是+-*/}else{Stringo=RNP.operator.peekFirst();if(o==null){//如果操作符栈为空,操作符直接入栈RNP.operator.push(operator);}else{charoperator2=o.charAt(0);//比较操作符,和操作符栈首的大小,如果操作符大,直接入栈if(operator2=='('14、15、operator2==')'16、17、orderOperator(c,o18、perator2)){RNP.operator.push(operator);//如果操作符栈首大,将操作符栈小于操作符的全部出栈,入栈操作数,最后改操作符入栈}else{while(true){if(o==null19、20、o.charAt(0)=='('21、22、o.charAt(0)==')'){break;}if(orderOperator(c,o.charAt(0))){break;}o=RNP.operator.pollFirst();RNP.operationNum.push(o);o=RNP.operator.peekFirst();}RNP.op23、erator.push(operator);}}}}}StringoperationNum=expression.substring(index);if(operationNum.trim().length()>0){RNP.operationNum.push(operationNum.trim());}while(RNP.operator.size()>0){RNP.operationNum.push(RNP.operator.pollFirst());}//RNP.operationNum.addAll(RNP.operator);}//判断一个字24、符是否为运算符privatestaticbooleanisOperator(charc){re
3、
4、c=='('
5、
6、c==')'){//操作数直接入栈StringoperationNum=ex
7、pression.substring(index,i);//区分负号和减号,如果'-'前面的一个是+-*/(认为是负号,'-'前面的是数或)认为是减号if(c=='-'){intin=i;while((expression.charAt(in-1))==''){in--;if(in==0){break;}}if(in==0){continue;}Stringprevious=expression.substring(in-1,i);if(isOperator(previous.charAt(0))
8、
9、previous.charAt(0)=='('){c
10、ontinue;}}if(operationNum.trim().length()>0){RNP.operationNum.push(operationNum.trim());}index=i+1;Stringoperator=c+"";//如果操作符是'(',直接入栈if('('==c){RNP.operator.push(operator);//如果操作符是')',将'('操作符之后的全部出栈,入栈操作数,'('')'舍弃}elseif(')'==c){while(true){Stringo=RNP.operator.pollFirst();if(
11、o==null
12、
13、"(".equals(o)){break;}RNP.operationNum.push(o);}//如果操作符是+-*/}else{Stringo=RNP.operator.peekFirst();if(o==null){//如果操作符栈为空,操作符直接入栈RNP.operator.push(operator);}else{charoperator2=o.charAt(0);//比较操作符,和操作符栈首的大小,如果操作符大,直接入栈if(operator2=='('
14、
15、operator2==')'
16、
17、orderOperator(c,o
18、perator2)){RNP.operator.push(operator);//如果操作符栈首大,将操作符栈小于操作符的全部出栈,入栈操作数,最后改操作符入栈}else{while(true){if(o==null
19、
20、o.charAt(0)=='('
21、
22、o.charAt(0)==')'){break;}if(orderOperator(c,o.charAt(0))){break;}o=RNP.operator.pollFirst();RNP.operationNum.push(o);o=RNP.operator.peekFirst();}RNP.op
23、erator.push(operator);}}}}}StringoperationNum=expression.substring(index);if(operationNum.trim().length()>0){RNP.operationNum.push(operationNum.trim());}while(RNP.operator.size()>0){RNP.operationNum.push(RNP.operator.pollFirst());}//RNP.operationNum.addAll(RNP.operator);}//判断一个字
24、符是否为运算符privatestaticbooleanisOperator(charc){re
此文档下载收益归作者所有