2012-05-03 176 views
0

我有一個問題,我在這個函數中找不到錯誤,它有時候可以很好地處理任何輸入,但是當輸入中有括號時,它會緩存{我想知道錯誤在哪裏此代碼,如何解決它,並有另一種更好的辦法,而不是這樣}將中綴表達式轉換爲後綴表達式

public static String Converting_infix_expressions_to_postfix_expressions(String infix) throws Exception{ 
    StringTokenizer st = new StringTokenizer(infix); 
    int numOF_tokens = st.countTokens(); 
    String postfix = "" ; 
    for (int i = 1; i <= numOF_tokens; i++) { 
     String term = st.nextToken(); 
     try { // if it is an Float there is no problem will happen 
      float x = Float.parseFloat(term); 
      postfix += x +" " ; 
      System.out.println("term is number " + term); 
     } catch (Exception e) { 
      System.out.println("term is symbol " + term); 
      if(stack.isEmpty()) 
       stack.push(term); 
      else if(term == "(") 
       stack.push(term); 
      else if(term == ")"){ 
       while((String)stack.peek() != "(") 
        postfix += stack.pop() +" "; 
       stack.pop(); 
      } 

      else{ 
       int x = 0,y = 0; 
       switch(term){ 
       case "+": x = 1; break; 
       case "-": x = 1; break; 
       case "*": x = 2; break; 
       case "/": x = 2; break; 
       } 
       switch((String)stack.peek()){ 
       case "+": y = 1; break; 
       case "-": y = 1; break; 
       case "*": y = 2; break; 
       case "/": y = 2; break; 
       } 
       if(x > y) 
        stack.push(term); 
       else { 
        int x1 = x , y1 = y; 
        boolean puchedBefore = false; 
        while(x1 <= y1){ 
         postfix += stack.pop() +" "; 
         if(stack.isEmpty() || stack.peek() == "("){ 
          stack.push(term); 
          puchedBefore = true; 
          break; 
         } 
         else{ 
          switch(term){ 
          case "+": x1 = 1; break; 
          case "-": x1 = 1; break; 
          case "*": x1 = 2; break; 
          case "/": x1 = 2; break; 
          } 
          switch((String)stack.peek()){ 
          case "+": y1 = 1; break; 
          case "-": y1 = 1; break; 
          case "*": y1 = 2; break; 
          case "/": y1 = 2; break; 
          } 
         } 
        } 
        if(!puchedBefore) 
         stack.push(term); 
       } 
      } 
     } 
    } 
    while(!stack.isEmpty()){ 
     postfix += stack.pop() +" "; 
    } 
    System.out.println("The postfix expression is : " + postfix); 
    return postfix; 
} 
+5

在比較字符串時,應該使用['equals'而不是'=='](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java)。 – assylias

+0

您是否嘗試過調試?獲取一個您知道失敗的案例並設置一個斷點,然後逐步查看它做出的決定對您沒有意義。此外,工作的表達式示例(以及它們的輸出)和那些不工作(和他們的輸出)將有助於使這是一個更好的問題。 – digitaljoel

+0

代碼中有相當多的重複......你是否考慮寫一個遞歸的遞歸解析器呢? –

回答

1

你有一對夫婦的問題與您的代碼。

  1. 由於在括號和數字之間可能沒有空格,因此您應該製作自定義字符串標記器。例如:(5 + 6)
  2. try-catch塊沒有正確使用。考慮一下,首先檢查該字段是否爲符號,然後將其解析爲Float。這樣可以避免讓大部分代碼出現在catch塊中。
  3. 你指的是可以與後續的改變而固定線18

    而(!stack.isEmpty()& &(字符串)stack.peek()!= 「(」)

    的錯誤
+0

同樣的答案,但我想不用括號 返回Sting沒有刪除括號末尾的括號 – mohsen

+0

這是一個輸入,程序與 墜毀1 * 2 + 3 *(5 + 2) - 3; – mohsen

+0

你有沒有嘗試上面提到的#3解決方案?我想你只是忘記檢查堆棧是否爲空。順便說一下,這是你的功課嗎? – user845279