2012-05-03 143 views
2

我有一個問題,我在這個函數中找不到錯誤,它有時候對一些輸入做得很好,但是有時候對於這個輸入來說沒有任何問題,這個輸入「6 2/3 - 4 2 * +」可以是任何一個幫幫我。在java中評估後綴表達式

public static double Evaluating_postfix_expressions(String postfix) throws Exception{ 
    StringTokenizer st = new StringTokenizer(postfix); 
    int numOF_tokens = st.countTokens(); 
    for (int i = 1; i <= numOF_tokens; i++) { 
     Object term = st.nextToken(); 
     try { // if it is an operand there is no problem 
      float x = Float.parseFloat((String)term); 
      stack.push(x); 
     } catch (Exception e) { // it is an operator 
      float v1 = (float) stack.pop(); 
      float v2 = (float) stack.pop(); 
      switch ((String) term) { 
      case "+": 
       stack.push(v2 + v1); 
       break; 
      case "-": 
       stack.push(v2 - v1); 
       break; 
      case "*": 
       stack.push(v2 * v1); 
       break; 
      case "/": 
       stack.push(v2/v1); 
       break; 
      } 
     } 
    } 
    return (float) stack.pop(); 
} 
+0

它對'1 2 +'之類的東西有用嗎? – sarnold

+0

應該做的功能是什麼? – Hassan

+1

'$'不是一個有效的操作符,但它會被異常抓住。運行你的代碼,並追蹤它,看看它實際上在做什麼。 – Makoto

回答

6

請注意,你給了一個不正確的操作員輸入:

6 2/3 – 4 2 * + 

注意一個版本手工鍵入這裏的區別:

6 2/3 - 4 2 * + 

你已經使用了而不是連字符 - 或者反過來:

$ echo -n – | xxd 
0000000: e280 93         ... 
$ echo -n - | xxd 
0000000: 2d          - 
$ 

這是一個沒有報告任何問題的全部例外的問題的一部分。你應該修改你的switch來報告無效的操作員,這會讓這個操作變得更容易。 (我只是碰巧認爲它看起來好笑。)

+2

他的教授完全知道他在做什麼 – climbage

+1

@climbage:哈!這是一個極好的理論。至少我希望你是對的。 – sarnold

+0

這不可能是家庭作業。 – jahroy