2017-03-08 28 views
0

我在android中爲rpn計算編寫了一個代碼,當我有括號內的運算符時它崩潰。例如,(89 + 7)崩潰但(8)7個輸出15. 這是我使用中綴到後綴轉換方法:Rpn轉換中的空棧異常

 private static List<String> convert(String input) { 
      int p = 0; 
      String pfb = ""; 
      Stack<Character> chara = new Stack<>(); 
      List<String> pfa = new ArrayList<>(); 
      for (int i = 0; i < input.length(); i++) { 
       char ch = input.charAt(i); 
       if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { 
        if (pfb.length() > 0) { 
         pfa.add(pfb); 
        } 
        pfb = ""; 
        if (chara.empty()) { 
         chara.push(ch); 
        } else { 
         Character chTop = (Character) chara.peek(); 
         if (chTop == '*' || chTop == '/') 
          p = 1; 
         else if (chTop == '+' || chTop == '-') 
          p = 0; 
         if (p == 1) { 
          if (ch == '+' || ch == '-') { 
           pfa.add(String.valueOf(chara.pop())); 
           i--; 
           Log.d("pfa", "" + input.length() + "" + i); 
          } else { // Same 
           pfa.add(String.valueOf(chara.pop())); 
           i--; 
          } 
         } else { 
          if (ch == '+' || ch == '-' && chara.peek() != '(') { 

           pfa.add(String.valueOf(chara.pop())); 
           chara.push(ch); 
          } else 
           chara.push(ch); 
         } 
        } 
       } else if (ch == '(') { 
        chara.push(ch); 
    //    Log.d("St",""+chara.peek()); 


       } else if (ch == ')') { 

    `//Code crashes here`   while (chara.peek() != '(' && !chara.empty()) { 
         pfa.add(String.valueOf(chara.pop())); 
        } 
        if (!chara.empty() && chara.peek() != '(') 
         return null; // invalid expression 
        else 
         chara.pop(); 


       } else { 
        pfb += ch; 
       } 
       // Log.d("pfa",""+pfa+""); 

      } 
      return pfa; 
     } 

回答

0

您代碼崩潰,因爲第一你偷看堆棧元素,然後檢查空情況。 應該像 而(!chara.empty()& & chara.peek()!=「(」)

+0

改變它,但它仍然崩潰。現在上彈出,而不是偷看。 –

+0

因爲你嘗試從空棧中彈出元素。將其他條件改爲else if(!chara.empty()&& chara.peek()=='(')chara.pop(); –