2015-09-15 94 views
0

我試圖讓使用子程序以下說明一些道理:評估Postfix(RPN)Java中的數學表達式。沒有堆棧,只串

I = 1

而我< = N

如果V-I是一個操作數:推v_i到tmp2。

如果v_i是運算符:將v_i應用於 tmp2的前兩個元素。用tmp2中的結果替換它們。

i = i + 1 從tmp2輸出結果。

所以基本上我想在後綴(RPN)窗體中計算一些表達式。在這裏,我希望每當數字是一個操作數(數字)被傳送到tmp2,並且有一個操作員通過tmp2中的valuse重新設定它時。例如3 5 1 +8/14 * = 14

其他問題:無論我寫什麼,我得到「線程中的異常」主「java.lang.StringIndexOutO ....」錯誤。 v_i是數字或運算符或括號。

感謝提前!

我的代碼:

static int eval(String postfix){ 
    int result = 0; 
    String temp2 =""; 

    for (int i=0 ; i<postfix.length(); i++) { 
     if (postfix.charAt(i) !=')' && postfix.charAt(i)!= '(' && postfix.charAt(i)!= p(infix.charAt(i))) 
      temp2 += postfix.charAt(i); 

     int num1,num2; 
     char operator; 

      do { 
       i++;    
      } while (Character.isDigit(postfix.charAt(i))); 

      num1 = Integer.parseInt(postfix.substring(0,i)); 
      operator = postfix.charAt(i++); 
      num2 = //Double.parseDouble(expression.substring(i)); 
       Integer.parseInt(postfix.substring(i+1)); 



      result = num1 + num2; 
      result = num1 - num2; 
      result = num1 * num2; 
      result = num1/num2; 

      switch (operator) { 

      case '+' : result = num1 + num2; break; 
      case '-' : result = num1 - num2; break; 
      case '*' : result = num1 * num2; break; 
      case '/' : result = num1/num2; break; 



      } 


    } 




    return result; 
} 
+0

您無法評估postfix或任何其他種類的-fix而無需堆棧。不清楚你在問什麼。你希望以某種方式使用一個字符串作爲一個堆棧?如果是這樣,爲什麼? – EJP

回答

0

這意味着你試圖訪問一個字符的字符數組的外部,即你的字符數組的長度是10,你正在試圖獲得第11字符。

爲您的問題的更好的方法是使用兩種或String.split StringTokenizer的StringTokenizer,然後通過每個令牌循環第一記號化的表達:

  • 如果令牌是一個操作數推入Stack --java有一個Stack類,所以使用它。
  • 如果令牌是一個操作符,從堆棧中彈出操作數並執行操作,則將該應答推回堆棧。
+0

謝謝!但分配的重點是使用字符串操作。 –

+0

我會爭論說,String.split或StringTokenize是操縱字符串的方法。如果你必須遍歷每個角色,而不是使用Stack來評估你的表情,那麼我認爲你正在浪費你的時間。沒有人在他們的正確思想中應該期望你這樣做。 – user3038723