|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
package expression; public class Calculate{ public static boolean isOperator(String operator){ if(operator.equals("+")||operator.equals("-")||operator.equals("*")||operator.equals("/")||operator.equals("(")||operator.equals(")")) return true; else return false; } public static int priority(String operator){ if(operator.equals("+")||operator.equals("-")||operator.equals("(")) return 1; else if(operator.equals("*")||operator.equals("/")) return 2; else return 0; } public static String twoResult(String operator,String a,String b){ try{ String op=operator; String rs=new String(); double x=Double.parseDouble(b); double y=Double.parseDouble(a); double z=0; if(op.equals("+")) z=x+y; else if(op.equals("-")) z=x-y; else if(op.equals("*")) z=x*y; else if(op.equals("/")) z=x/y; else z=0; return rs+z; } catch(NumberFormatException e){ System.out.println("input has something wrong!"); return "Error"; } } } package expression; import java.util.*; public class Stacks{ private LinkedList list=new LinkedList(); int top=-1; public void push(Object value){ top++; list.addFirst(value); } public Object pop(){ Object temp=list.getFirst(); top--; list.removeFirst(); return temp; } public Object top(){ return list.getFirst(); } } package expression; import java.io.*; import java.util.*; public class Expression{ private ArrayList expression=new ArrayList();//存储中序表达式 private ArrayList right=new ArrayList();//存储右序表达式 private String result;//结果 //依据输入信息创建对象,将数值与操作符放入ArrayList中 private Expression(String input){ StringTokenizer st=new StringTokenizer(input,"+-*/()",true); while(st.hasMoreElements()){ expression.add(st.nextToken()); } } //将中序表达式转变为右序表达式 private void toRight(){ Stacks aStack=new Stacks(); String operator; int position=0; while(true){ if(Calculate.isOperator((String)expression.get(position))){ if(aStack.top==-1||((String)expression.get(position)).equals("(")){ aStack.push(expression.get(position)); } else{ if(((String)expression.get(position)).equals(")")){ if(!((String)aStack.top()).equals("(")){ operator=(String)aStack.pop(); right.add(operator); } } else{ if(Calculate.priority((String)expression.get(position))<=Calculate.priority((String)aStack.top())&&aStack.top!=-1){ operator=(String)aStack.pop(); if(!operator.equals("(")) right.add(operator); } aStack.push(expression.get(position)); } } } else right.add(expression.get(position)); position++; if(position>=expression.size()) break; } while(aStack.top!=-1){ operator=(String)aStack.pop(); right.add(operator); } } //对右序表达式进行求值 private void getResult(){ this.toRight(); Stacks aStack=new Stacks(); String op1,op2,is=null; Iterator it=right.iterator(); while(it.hasNext()){ is=(String)it.next(); if(Calculate.isOperator(is)){ op1=(String)aStack.pop(); op2=(String)aStack.pop(); aStack.push(Calculate.twoResult(is,op1,op2)); } else aStack.push(is); } result=(String)aStack.pop(); it=expression.iterator(); while(it.hasNext()){ System.out.print((String)it.next()); } System.out.println("="+result); } public static void main(String avg[]){ try{ System.out.println("Input a expression:"); BufferedReader is=new BufferedReader(new InputStreamReader(System.in)); for(;;){ String input=new String(); input=is.readLine().trim(); if(input.equals("q")) break; else{ Expression boya=new Expression(input); boya.getResult(); } System.out.println("Input another expression or input \\\'q\\\' to quit:"); } is.close(); } catch(IOException e){ System.out.println("Wrong input!!!"); } } } 返回类别: 教程 上一教程: Java非常处理--尽量不要从try区段中返回(return) 下一教程: java中Properties类的使用 您可以阅读与"JAVA数据结构示例---逆波兰式求值!"相关的教程: · 用java学习数据结构--单链表 · Java数据结构---基于数组的表 · 数据结构――栈、队列和树(Java) · 一个简朴的表达式求值类,java · 一段简朴的根据SQLServer数据库表结构生成C#实体类的Java代码 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |