完整的Java表达式算法.doc

上传人:自*** 文档编号:126262633 上传时间:2020-03-23 格式:DOC 页数:21 大小:72KB
返回 下载 相关 举报
完整的Java表达式算法.doc_第1页
第1页 / 共21页
完整的Java表达式算法.doc_第2页
第2页 / 共21页
完整的Java表达式算法.doc_第3页
第3页 / 共21页
完整的Java表达式算法.doc_第4页
第4页 / 共21页
完整的Java表达式算法.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《完整的Java表达式算法.doc》由会员分享,可在线阅读,更多相关《完整的Java表达式算法.doc(21页珍藏版)》请在金锄头文库上搜索。

1、完整的Java表达式算法-扩充容易本文的表达式求值采用标准的算法。首先从最简单的表达式求值开始,到后面的高级表达式求值。大郅算法如下,首先将表达式转换为后序表达式,然后对后序表达式求值。表示式求值的关键步骤式表达式语义的解析和分割,而对于表达式的求值反而简单。在实际应用中,经常会有如下的场景:1、对一行数据进行运算,例如:总价=单价*数量。2、对集合数据进行运算,例如:平均销售价格=sum(单价*数量)/sum(数量)。3、对集合数据进行运算,例如:全校平均成绩=(sum(数学平均分)*sum(数学考试人数)+sum(语文平均分)*sum(语文考试人数)/(sum(数学考试人数+语文考试人数)

2、。本文中的算法完全可以解决此类问题。一、将公式变换为后序表达式1)检查输入的下一元素。2)假如是个操作数,输出。3)假如是个开括号,将其压栈。4)假如是个运算符,则i) 假如栈为空,将此运算符压栈。ii) 假如栈顶是开括号,将此运算符压栈。iii) 假如此运算符比栈顶运算符优先级高,将此运算符压入栈中。iv) 否则栈顶运算符出栈并输出,重复步骤4。5)假如是个闭括号,栈中运算符逐个出栈并输出,直到遇到开括号。开括号出栈并丢弃。6)假如输入还未完毕,跳转到步骤1。7)假如输入完毕,栈中剩余的所有操作符出栈并输出它们。算法如下:view plaincopy to clipboardprint? p

3、ublic static Stack convertToPostfix (StringSplit x) String s = x.getNext () ; Stack st = new Stack () ; Stack rSt = new Stack () ; while (s != null) if (isBlank (s) /break; else if (isOpenParenthesis (s) st.push (s) ; else if (isCloseParenthesis (s) String as = null ; if (st.isEmpty () System.out.pr

4、intln (错误:缺少() ; else as = st.pop () ; while (!isOpenParenthesis (as) rSt.push (as) ; if (st.isEmpty () System.out.println (错误:缺少() ; break ; else as = st.pop () ; else if (isOperator (s) if (!st.isEmpty () String as = st.pop () ; while (priority (as) = priority (s) rSt.push (as) ; if (st.isEmpty ()

5、 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 () String as = st.pop () ; if (isOpenParenthesis (as) System.out.println (错误:缺少) ; else if (isCloseParenthesis (as) System.out.println (错误:缺少()

6、 ; else rSt.push (as) ; Stack nSt = new Stack () ; while (!rSt.empty () nSt.push (rSt.pop () ; return nSt ; public static Stack convertToPostfix (StringSplit x) String s = x.getNext () ; Stack st = new Stack () ; Stack rSt = new Stack () ; while (s != null) if (isBlank (s) /break; else if (isOpenPar

7、enthesis (s) st.push (s) ; else if (isCloseParenthesis (s) String as = 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 () ; else if (isOperator (s) if

8、(!st.isEmpty () String as = st.pop () ; while (priority (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 () String as = st.pop () ; if (isO

9、penParenthesis (as) System.out.println (错误:缺少) ; else if (isCloseParenthesis (as) System.out.println (错误:缺少() ; else rSt.push (as) ; Stack nSt = new Stack () ; while (!rSt.empty () nSt.push (rSt.pop () ; return nSt ; 类StringSplit是接口,目的是将表示式进行拆分,拆分为操作数、括号、运算符。本文中实现了单一字符解析、多字符解析以及函数解析等功能。以满足不同的应用场景。vi

10、ew plaincopy to clipboardprint? package net.csdn.blog.z3h.util ; public interface StringSplit String getNext () ; package net.csdn.blog.z3h.util ; public interface StringSplit String getNext () ;二、对后序表达式进行求值计算1)初始化一个空堆栈2)从左到右读入后缀表达式i)如果字符是一个操作数,把它压入堆栈。ii)如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。3)到后缀表达式末尾,从堆栈中弹出结果。若后缀表达式格式正确,那么堆栈应该为空。view plaincopy to clipboardprint? public static double numberCalculate (Stack st) Stack tSt = new Stack () ; while (!st.empty ()

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号