2014-11-04 28 views
0

我在java中製作了一個括號檢查程序,它從標準輸入讀入文本流並使用堆棧來確定它的括號是否正確平衡。例如,它應該爲[()]{}{[()()]()}輸入true,在[(])輸出false。我已經做了Stack類我自己對這個問題:java中的括號檢查器

public class Stack { 
private char items[]; 
private int top; 

Stack(int n){ 
    items = new char[n]; 
    top = -1; 
} 

void push(char c){ 
    if(top == items.length-1){ 
     System.out.println("Stack full."); 
     return; 
    } 
    top++; 
    items[top] = c; 
} 

char pop(){ 
    if(isEmpty()){ 
     System.out.println("Stack empty"); 
     return (char)0; 
    } 
    char p; 
    p = items[top]; 
    top--; 
    return p; 
} 

boolean isEmpty(){ 
    if(top == -1) 
     return true; 
    else  
     return false; 
} 

}

checkValid方法下面需要一個字符串輸入,如果括號匹配返回true,false,如果它們不匹配。

public static Boolean checkValid(String str){ 
     char sym,prev; 
     Stack s = new Stack(str.length()); 
     for(int i=0; i<str.length();i++){ 
      sym = str.charAt(i); 
      if(sym == '(' || sym=='{' || sym=='['){ 
       s.push(sym); 
      } 
      if(sym == ')' || sym=='}' || sym==']'){ 
       if(s.isEmpty()){ 
        return false; 
       } 
       else{ 
        prev = s.pop(); 
        if(!isPairMatch(prev,sym)) 
         return false; 
       } 
      } 

     } 
     if(!s.isEmpty()) 
      return false; 
     return true; 
    } 
    public static boolean isPairMatch(char character1, char character2){ 
     if(character1 == '(' && character2 == ')') 
      return true; 
     else if(character1 == '{' && character2 == '}') 
      return true; 
     else if(character1 == '[' && character2 == ']') 
      return true; 
     else 
      return false; 
    } 
} 

有沒有辦法打印不匹配圓括號的位置?

+0

那麼,不匹配的圓括號的位置應該與堆棧的大小(或「大小-1」)相同。 – Tom 2014-11-04 10:03:43

回答

1

如果你的籌碼,而不是抱着chars,將舉行一個同時包含char和輸入字符串,char的指標,你就可以打印出無與倫比的括號的索引類。

編輯:

如果你想失敗的isPairMatch測試都無法比擬的括號的索引該解決方案時,才需要。

例如,如果您有字符串「[{} {} {})」,那麼不匹配的對是第一個「[」和最後一個「)」,其索引爲0和7.

如果您只需要第一個不匹配括號的索引(即第一個索引爲0的「[」),則只需在刪除該括號後檢查堆棧的大小。在這個例子中,當最後一對被檢查時堆棧將是空的,所以堆棧的大小將爲0,這是失敗的isPairMatch測試的第一個字符的索引。

+0

然後程序能夠檢查是否有一個特定的開幕式的正確右括號? – rick112358 2014-11-04 10:03:56

+0

您需要一個映射其中k是索引,v是數值,即括號。 – ha9u63ar 2014-11-04 10:04:40

+0

@ rick112358你的算法會保持不變。唯一的區別是,代替(例如)將'{'推入堆棧,您會推新的Item('{',4)。 'isPairMatch'將接收兩個項目而不是兩個字符,如果這些項目中存儲的字符對不匹配,則可以打印這些字符的索引。 – Eran 2014-11-04 10:08:30