http://www.cnxuexi.com/computer/chengxusheji/Java/4297.htmlpackage 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!!!");
  }
 }
}
算(2+2*3)/2 就有问题,算错了.请高手指点一下为什么.将代码改一下.谢谢!!!

解决方案 »

  1.   

    该你改了一下,貌似改对了。改了2个地方package com.unnamed.training.ibatis.ex1.test;import java.io.*;
    import java.util.*;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("-")) return 1;
    else if(operator.equals("*")||operator.equals("/")) return 2;
    else return 0;
    }
    public static String twoResult(String operator,String a,String b){
    System.out.println(operator+","+a+","+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";
    }
    }
    }class Stacks{
    private LinkedList list=new LinkedList();
    int top=-1;
    public void push(Object value){
    top++;
    list.addFirst(value);
    System.out.println("push:"+value);
    }
    public Object pop(){
    Object temp=list.getFirst();
    top--;
    list.removeFirst();
    System.out.println("pop:"+temp);
    return temp; }
    public Object top(){
    return list.getFirst();
    }
    }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);
    String temp;
    while(st.hasMoreElements()){
    temp=st.nextToken();
    //System.out.println(temp);
    expression.add(temp);
    }
    }
    //将中序表达式转换为右序表达式
    private void toRight(){
    Stacks aStack=new Stacks();
    String operator;
    int position=0;
    while(true){
    String temp=(String)expression.get(position);
    if(Calculate.isOperator(temp)){
    if(aStack.top==-1||temp.equals("(")){
    aStack.push(temp);
    } else{
    if(temp.equals(")")){
    /*if(!((String)aStack.top()).equals("(")){
    operator=(String)aStack.pop();
    right.add(operator);
    }*/
    operator=(String)aStack.pop();
    while (!operator.equals("(")) {
    right.add(operator);
    operator=(String)aStack.pop();

    } else{
    if(Calculate.priority(temp)<=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();
    System.out.println(right);
    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!!!");
    }
    }
    }
      

  2.   

    一个地方是
    public static int priority(String operator){
    if(operator.equals("+")||operator.equals("-")) return 1;
    else if(operator.equals("*")||operator.equals("/")) return 2;
    else return 0;
    }
      

  3.   

    另一个地方是: if(temp.equals(")")){
    /*if(!((String)aStack.top()).equals("(")){
    operator=(String)aStack.pop();
    right.add(operator);
    }*/
    operator=(String)aStack.pop();
    while (!operator.equals("(")) {
    right.add(operator);
    operator=(String)aStack.pop();