欢迎来到天天文库
浏览记录
ID:9016608
大小:123.00 KB
页数:21页
时间:2018-04-15
《完整的java表达式算法》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、完整的Java表达式算法---扩充容易本文的表达式求值采用标准的算法。首先从最简单的表达式求值开始,到后面的高级表达式求值。大郅算法如下,首先将表达式转换为后序表达式,然后对后序表达式求值。表示式求值的关键步骤式表达式语义的解析和分割,而对于表达式的求值反而简单。在实际应用中,经常会有如下的场景:1、对一行数据进行运算,例如:总价=单价*数量。2、对集合数据进行运算,例如:平均销售价格=sum(单价*数量)/sum(数量)。3、对集合数据进行运算,例如:全校平均成绩=(sum(数学平均分)*sum(数学考试人数)+sum(语文平均分)*sum(语文考试
2、人数))/(sum(数学考试人数+语文考试人数)。本文中的算法完全可以解决此类问题。一、将公式变换为后序表达式1)检查输入的下一元素。2)假如是个操作数,输出。3)假如是个开括号,将其压栈。4)假如是个运算符,则i)假如栈为空,将此运算符压栈。ii)假如栈顶是开括号,将此运算符压栈。iii)假如此运算符比栈顶运算符优先级高,将此运算符压入栈中。iv)否则栈顶运算符出栈并输出,重复步骤4。5)假如是个闭括号,栈中运算符逐个出栈并输出,直到遇到开括号。开括号出栈并丢弃。6)假如输入还未完毕,跳转到步骤1。7)假如输入完毕,栈中剩余的所有操作符出栈并输出它们
3、。算法如下:viewplaincopytoclipboardprint?publicstaticStackconvertToPostfix(StringSplitx){Strings=x.getNext();Stackst=newStack();StackrSt=newStack();while(s!=null){if(isBlank(s)){//break;}elseif(isOpenParenthesis(s)){st.push(s);}elseif(isClosePa
4、renthesis(s)){Stringas=null;if(st.isEmpty()){System.out.println("错误:缺少(");}else{as=st.pop();while(!isOpenParenthesis(as)){rSt.push(as);if(st.isEmpty()){System.out.println("错误:缺少(");break;}else{as=st.pop();}}}}elseif(isOperator(s)){if(!st.isEmpty()){Stringas=st.pop();while(priori
5、ty(as)>=priority(s)){rSt.push(as);if(st.isEmpty()){as=null;}else{as=st.pop();}}if(as!=null){st.push(as);}st.push(s);}else{st.push(s);}}else{rSt.push(s);}s=x.getNext();}while(!st.isEmpty()){Stringas=st.pop();if(isOpenParenthesis(as)){System.out.println("错误:缺少)");}elseif(isClosePa
6、renthesis(as)){System.out.println("错误:缺少(");}else{rSt.push(as);}}StacknSt=newStack();while(!rSt.empty()){nSt.push(rSt.pop());}returnnSt;}publicstaticStackconvertToPostfix(StringSplitx){Strings=x.getNext();Stackst=newStack();StackrS
7、t=newStack();while(s!=null){if(isBlank(s)){//break;}elseif(isOpenParenthesis(s)){st.push(s);}elseif(isCloseParenthesis(s)){Stringas=null;if(st.isEmpty()){System.out.println("错误:缺少(");}else{as=st.pop();while(!isOpenParenthesis(as)){rSt.push(as);if(st.isEmpty()){System.out
8、.println("错误:缺少(");break;}else{as=st.pop();}}}}
此文档下载收益归作者所有