2011-08-30 75 views
2

我已经尝试从头开始编写此代码,编码并运行它,但它似乎并不奏效。这在课堂上被指定为实验室工作。要求如下: 使用堆栈和堆栈操作(用户定义)实现后缀评估。 我认为我的程序算法是正确的,但它总是给我一个错误的答案。 这是我的代码。需要在执行Java算法Postfix评估方面的帮助

public class StackApplication { 

    public static class Stack<T> { 

     private int top = 0; 
     private final static int stackMax=100; 
     // highest index of stk array 
     private Object[] stk = new Object[stackMax+1]; 
     //Elements must be cast back. 

     public Stack() { // constructor 
     } 

     public boolean isEmpty(){ 
      if (top==0) return true; 
      else return false; 
     } 

     public void push(T el) { 
      if(top==stackMax) 
       System.out.println("Stack push overflow error"); 
      else top=top+1; 
      stk[top]=el; 
     } 

     public T pop(){ 
      if(isEmpty()){ 
       System.out.println("Stack push underflow error"); 
       return null; 
      } 
      else top=top-1; 
      return(T)stk[top+1]; 
     } 

     public T top(){ 
      if(isEmpty()){ 
       //System.out.println("Stack empty"); 
       return null; 
      } 
      else return (T)stk[top]; 
     } 
    } 
    public static boolean isOperator(char c){ 
     return(c=='+' || c=='-' || c=='/' || c=='*' || c=='^'); 
    } 
    public static double evaluate(double x, char o, double y) { 

     double result=0; 
     switch(o) { 
      case '+' : result=x+y; break; 
      case '-' : result=x-y; break; 
      case '*' : result=x*y; break; 
      case '/' : result=x/y; break; 
      case '^' : result=Math.pow(x, y); break; 
      default : break;  
     } 
     return result; 
    } 

    public static void main(String[] args) { 
     Scanner console=new Scanner(System.in); 
     Stack<Double> s=new Stack<Double>(); 

     System.out.println("Input Postfix form to evaluate:"); 
     String inp=console.nextLine(); 
     char[] chararray=inp.toCharArray(); 
     double b,a; 

     for(int i=0; i<chararray.length; i++) { 
      if(!isOperator(chararray[i])) 
       s.push((double)chararray[i]); 
      else { 
       b=s.pop(); 
       a=s.pop(); 
       double c=evaluate(a, chararray[i], b); 
       s.push(c); 
      } 
     } 
     System.out.println(" " +s.pop()); 
    } 
} 

样本输出: 输入后缀形式来评价:

23+ (Input) 
101.0 (Output) 
5.0 (Expected output) 
+1

对于这种问题,我认为你最好调试问题。如下面的评论所示,如果您曾尝试进入课程执行阶段,您将很容易找到此根本原因 – Ivan

回答

1

的问题是在这里:s.push((double)chararray[i]);。您无法通过这种方式将char转换为double。您现在正在使用23的ascii代码。

50(ascii code of 2) + 51(ascii code of 3) = 101

做这样的:s.push((double)(chararray[i] - '0'));

+0

谢谢。我现在意识到,铸造加倍对于这些行动毫无意义。不幸的是,转换为任何数据类型都不等于解析。谢谢您的帮助。 – user919789

+0

@ user919789 - 不客气:) –

1

你在做加法的ASCII码为2和3,而不是2和3

2的代码是50,因为3是51,所以你的出局是101,在这种情况下是正确的。

当您按下时,按chararray[i]-'0'。这将解决您的问题。