import java.util.ArrayList; import java.util.Stack; public class PostfixExp { private Stack<String> opStack; private Stack<String> expStack; private String[] ops = {"+", "-", "*", "/", "(", ")", "#"}; public PostfixExp() { opStack = new Stack<String>(); expStack = new Stack<String>(); } private boolean isOp(char c) { String cStr = Character.toString(c); for (String op : ops) { if(cStr.equals(op)) { return true; } } return false; } private boolean isOp(String str) { for(String op : ops) { if(str.equals(op)) { return true; } } return false; } private int getOpPriority(String op){ if("+".equals(op) || "-".equals(op)) { return 1; } else if("*".equals(op) || "/".equals(op)) { return 2; } else if("(".equals(op)) { return 3; } else if("#".equals(op)) { return 0; } return Integer.MAX_VALUE; } public String[] getItems(String str) { ArrayList<String> list = new ArrayList<String>(); // Remove all blank spaces. str = str.replaceAll("\\s", ""); int i = 0; StringBuilder sBuilder = new StringBuilder(); while(i < str.length()) { if(i == str.length() - 1) { sBuilder.append( Character.toString(str.charAt(i))); list.add(sBuilder.toString()); } if(!isOp(str.charAt(i))) { sBuilder.append( Character.toString(str.charAt(i))); } else { if(sBuilder.length() > 0) { list.add(sBuilder.toString()); sBuilder.delete(0, sBuilder.length()); } list.add(Character.toString(str.charAt(i))); } ++i; } list.add("#"); String[] result = new String[list.size()]; return list.toArray(result); } public ArrayList<String> change2PostfixExp(String normalExp) { ArrayList<String> expList = new ArrayList<String>(); String[] items = getItems(normalExp); opStack.clear(); expStack.clear(); opStack.push("#"); int i = 0; while(i < items.length) { //System.out.println(i + ":" + items[i]); if(!isOp(items[i])) { expList.add(items[i]); } else { if(items[i].equals(")")){ while(!opStack.isEmpty() && !opStack.peek().equals("(")) { expList.add(opStack.pop()); } if(!opStack.isEmpty() && opStack.peek().equals("(")) { opStack.pop(); } ++i; continue; } if(items[i].equals("#")) { while(!opStack.isEmpty() && !opStack.peek().equals("#")) { expList.add(opStack.pop()); } break; } if(!opStack.isEmpty()) { while(!opStack.isEmpty() && (getOpPriority(opStack.peek()) >= getOpPriority(items[i]) && !opStack.peek().equals("(")) ) { expList.add(opStack.pop()); } opStack.push(items[i]); } } ++i; } return expList; } public double calculate(ArrayList<String> postfixExp) { Stack<Double> calcStack = new Stack<Double>(); int i = 0; String ite = null; double result = Double.MAX_VALUE; while(i < postfixExp.size()) { ite = postfixExp.get(i); if(!isOp(postfixExp.get(i))) { calcStack.push(new Double( Double.parseDouble( postfixExp.get(i)) )); } else { double num2 = calcStack.peek(); calcStack.pop(); if(!calcStack.isEmpty()) { double num1 = calcStack.peek(); calcStack.pop(); if("*".equals(ite)) { result = num1 * num2; } else if("+".equals(ite)) { result = num1 + num2; } else if("-".equals(ite)) { result = num1 - num2; } else if("/".equals(ite)) { result = num1 / num2; } System.out.println(num1 + "\t" + ite + "\t" + num2 + " = " + result); calcStack.push(result); } } ++i; } return result; } public static void main(String[] args) { PostfixExp pExp = new PostfixExp(); //String exp = "a + b*c + (d * e + f) * g"; //string exp = "1+1+3*2*3-4"; //string exp = "2+(1+3)*2*3-4"; //string exp = "2+1+3*2*(3-4)"; String exp = "(13+10/2)*21*(39-4)"; String case1 = "(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))"; String case2 = "(6*7+9+8/2*12+12/3)+88/11"; String case3 = "(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))"; String case4 = "(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))"; String case5 = "(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))"; String case6 = "(3*(4+9)+8/(2*12)+12/3)+(((7+(13+10/2))*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))"; ArrayList<String> expList = pExp.change2PostfixExp(case6); for(String item : expList) { System.out.print(item + " "); } System.out.println("\n"); System.out.println("My answer is \t\t" + pExp.calculate(expList)); int rightAnswer = (3*(4+9)+8/(2*12)+12/3)+(((7+(13+10/2))*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4))))+(6*7+9+8/2*12+12/3)+((88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))+(6*7+9+8/2*12+12/3)+(88/11+(13+10/2)*(21*(39-4)+(13+10/2)*21*(39-4)))); System.out.println("The right answer is \t" + rightAnswer); System.out.println(); } }
相关推荐
java中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。
java 算术表达式求值器 java 算术表达式求值器
带反编译器,各种java算术表达式求值.包括开源的和网友开发的
利用逆波兰法球表达式的值,java和c++版的,只能计算带小数点和括号
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
对用+、-、*、/、(、)连接起来的算术表达式求值, 可以智能识别和过滤表达式。
java模拟栈实现表达式求值代码.zip可以完全实现多种功能的计算,采用了算符优先关系计算表达式的值。 注意:表达式的形式为 #表达式# 的形式,两个#号只表示表达式的开始和结束,真正的表达式在中间部分。。。。
有Bug可联系303447589.愿意为你解答,感谢378200809网友的提问,才有这个更新。
java编写的表达式求值(支持小数,指数运算),第一次上传,多多指教
此文档中的代码实现了简单的计算中缀表达式的求值方法,通过把中缀表达式转换为后缀表达式,可以很方便的进行求值。
表达式求值 逆波兰表达式算法,支持任何位数值运算,运算符支持+-*/(),其它运算符请自行扩展,代码比较松耦合可扩展性好
掌握基于栈实现算术表达式求值的原理和算法。 使用VC++语言编写程序,根据数据结构中栈的的逻辑特性和物理存储结构,使用栈实现考虑算符优先的算术表达式求值算法,编译运行程序。
数据结构算术表达式求值,还可用于《程序设计方法学》(第2版)胡正国出版的习题
后缀表达式求值实现,包含runsome及runall。 使用java语言;包含Scanner及printwriter使用。
JAVA数据结构复杂表达式求值
NULL 博文链接:https://128kj.iteye.com/blog/1623312