2011-09-16 101 views
1

我要瘋了......我非常接近讓這段代碼以我想要的方式工作,我無法想象它。我正試圖解決ex的後綴方程。 3 2 +,這等於5.當我在例子 「3 2 +」的主要方法,它工作正常,但只要我輸入第3位像「3 2 + 2 *」(等於10),我得到一個arrayoutofboundserror關聯到number2 = s.pop(),您將在下面的代碼中看到。任何幫助是極大的讚賞。使用堆棧進行Postfix評估。

繼承人的後綴meethod:

public int PostfixEvaluate(String e){ 
     int number1; 
     int number2; 
     int result=0; 

     String[] tokens = e.split(" "); 

      for(int j = 0; j < tokens.length; j++){ 
       String token = tokens[j]; 
      if (!"+".equals(token) && !"*".equals(token) && !"-".equals(token) && !"/".equals(token)) { 
       s.push(Integer.parseInt(token)); 

     } else { 
       String Operator = tokens[j]; 
       number1 = s.pop(); 
       number2 = s.pop(); 
       if (Operator.equals("/")){ 
        result = number1/number2;} 
       else if(Operator.equals("*")){ 
        result = number1 * number2;} 
       else if(Operator.equals("+")){ 
        result = number1 + number2;} 
       else if(Operator.equals("-")){ 
        result = number1 - number2;} 
       else System.out.println("Illeagal symbol"); 
      } 
       s.push(result); 

        s.pop(); 
       } 


     //s.pop(); 
     System.out.println("Postfix Evauation = " + result); 

      return result; 
} 

public static void main(String[] args) { 
    Stacked st = new Stacked(100); 
    //String y = new String("((z * j)/(b * 8) ^2"); 
    String x = new String("2 2 2 * +"); 
    TestingClass clas = new TestingClass(st); 

    //clas.test(y); 
    clas.PostfixEvaluate(x); 

    } 

}

+0

這是怎麼回事?「3 2 + 2 *」 - 等於10 –

回答

1

你馬上推後彈出?

s.push(result); 
s.pop(); 
+0

我明白了......終於。我不得不在for(loop)之外的else {}和pop()中推送(result)。 – TMan

+1

是的,立即刪除你放在某個地方的數據幾乎是不行的;) –

+0

這是怎麼回事 - 「3 2 + 2 *」 - 等於10.正如問題中所解釋的那樣。 –

1

此解決方案還有另一個邏輯錯誤。你需要做的:如果你有32/因爲你將其評估爲2/3

number2 = s.pop(); 
number1 = s.pop(); 

您的解決方案將無法工作。

3
/** 
* Evaluate postfix arithmetic expression 
* 
* @example "1 12 23 + * 4 5/-" => 34.2 
* @author Yong Su 
*/ 
import java.util.Stack; 

class PostfixEvaluation { 

    public static void main(String[] args) { 
     String postfix = "1 12 23 + * 4 5/-"; 
     Double value = evaluate(postfix); 
     System.out.println(value); 
    } 

    /** 
    * Evaluate postfix expression 
    * 
    * @param postfix The postfix expression 
    */ 
    public static Double evaluate(String postfix) { 
     // Use a stack to track all the numbers and temporary results 
     Stack<Double> s = new Stack<Double>(); 

     // Convert expression to char array 
     char[] chars = postfix.toCharArray(); 

     // Cache the length of expression 
     int N = chars.length; 

     for (int i = 0; i < N; i++) { 
      char ch = chars[i]; 

      if (isOperator(ch)) { 
       // Operator, simply pop out two numbers from stack and perfom operation 
       // Notice the order of operands 
       switch (ch) { 
        case '+': s.push(s.pop() + s.pop());  break; 
        case '*': s.push(s.pop() * s.pop());  break; 
        case '-': s.push(-s.pop() + s.pop()); break; 
        case '/': s.push(1/s.pop() * s.pop()); break; 
       } 
      } else if(Character.isDigit(ch)) { 
       // Number, push to the stack 
       s.push(0.0); 
       while (Character.isDigit(chars[i])) 
        s.push(10.0 * s.pop() + (chars[i++] - '0')); 
      } 
     } 

     // The final result should be located in the bottom of stack 
     // Otherwise return 0.0 
     if (!s.isEmpty()) 
      return s.pop(); 
     else 
      return 0.0; 
    } 

    /** 
    * Check if the character is an operator 
    */ 
    private static boolean isOperator(char ch) { 
     return ch == '*' || ch == '/' || ch == '+' || ch == '-'; 
    } 
} 
3

number1的分配應該在number2分配之後。請記住,s.pop()將刪除並返回頂部的數字。

number2 = s.pop(); 
number1 = s.pop();