2014-02-21 51 views
0

我想要使括號匹配。需要匹配的是'()','[]','{}'和'[{}]'應該輸出爲true。我不希望它適用於諸如「[{]}」或「[{}」)的情況。雖然,現在我的代碼即使應該是正確的,也不會輸出正確匹配的結果。支架錯誤匹配

代碼(更新):

int booleanBalanceBracket(aStack *theStack){ 
    aStack *balanceStack = NULL; 

    while(theStack){ 
     if(theStack->token == '[' || theStack->token == '{' || theStack->token == '(') 
      balanceStack = pushBracket(theStack->token, balanceStack); 
     else if(theStack->token == ']' || theStack->token == '}' || theStack->token == ')'){ 
      if(balanceStack == NULL) 
       return 0; 
      else 
       balanceStack = popBracket(balanceStack); 
     } 
     theStack = theStack->nextItem; 
    } 
    if(balanceStack == NULL){ 
     return 1; 
    }else{ 
     return 0; 
    } 

} 
int isMatching(int token1, int token2){ 
    if(token2 == '(' && token1 == ')') 
     return 1; 
    else if(token2 == '{' && token1 == '}') 
     return 1; 
    else if(token2 == '[' && token1 == ']') 
     return 1; 
    else 
     return 0; 
} 
+0

您是否嘗試過一個簡單的輸入,然後通過代碼在調試器步進尋找到執行不符合預期的實例? –

+1

最明顯的一點是,如果稍後有匹配,則會遺忘不匹配。一旦發現不匹配,你應該立即保釋。另外,你的代碼看起來太複雜了......只需要一個堆棧,在遇到匹配時丟棄它們。 –

回答

2

試試這個簡單的算法:

for each char c in the input 
    if opener 
     push on stack 
    else if closer 
     if stack is empty or doesn't match 
      return false 
     else 
      remove top of stack 

return true if stack is empty, else false 

這可以略微優化,以避免空棧檢查,也推動以避免EOF明確檢查最初將EOF放入堆棧,並將EOF與EOF相匹配。

+0

因此,如果我的閉門器位於堆棧的頂端,那麼這項工作是否會在FIFO中運行呢? – pmac89

+0

此外,我用這個,現在我得到的是,有匹配的時候,但也爲非匹配的字符串。 – pmac89

+0

@ pmac89這將以我編寫它的方式工作 - 作爲輸入循環。爲什麼你想在處理它們之前把你的字符放在堆棧上?但是,如果由於某種原因輸入是堆疊的,只要將開瓶器視爲閉合器和v.v.以上。 –

0

你的代碼的問題是這條線

balanceStack = popBracket(balanceStack); 

沒有收到彈出的值。還需要比較彈出的值。

一個簡單的字符串

bool booleanBaranceBracket(const char *s){ 
    static const char *left = "{(["; 
    static const char *right = "})]"; 
    size_t len = strlen(s); 
    char *p, stack[len]; 
    int sp = -1; 
    int i; 
    for(i=0;i<len;++i){ 
     if(p = strchr(left, s[i])) 
      stack[++sp] = s[i]; 
     else if(p = strchr(right, s[i])){ 
      char ch; 
      if(sp == -1) return false; 
      ch = stack[sp--]; 
      if(ch != left[p - right]) return false; 
     } 
    } 
    return sp == -1; 
}