2017-09-07 115 views
-1

我想在C++中創建平衡括號。我有兩個功能,is_balancedconvert_bracket。基本上,在is_balanced中,我將左括號添加到堆棧中,並在字符串中出現相應的右括號時將其彈出。但是,由於某種原因,s == convert_bracket(bracketStack.top())總是失敗,即使s = '('bracketStack.top() == ')'(convert_bracket會將其轉換爲'(')。我需要這個條件才能通過,以便物品可以從堆疊中取出。我能得到任何建議嗎?Stacks:C++中的平衡括號失敗

#include <map> 
#include <set> 
#include <stack> 
#include <string> 
#include <cstdio> 
#include <cstring> 
#include <iostream> 
#include <unordered_map> 

using namespace std; 

char convert_bracket(char s) { 
    switch(s){ 
     case ')': s = '('; 
      break; 
     case ']': s= '['; 
      break; 
     case '}': s= '{'; 
      break; 
    } 
    return s; 
} 

bool is_balanced(string expression) { 
    stack<char> bracketStack; 
    for(char s : expression){ 
     if(s == '(' || s == '[' || s == '{'){ 
      bracketStack.push(s); 
     } else { 
      if(bracketStack.size()>0 && s == convert_bracket(bracketStack.top())) { 
       bracketStack.pop(); 
      } else { 
       return false; 
      } 
     } 
    } 
    if(bracketStack.size() == 0) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 

int main(){ 
    string expression = "{[()]}"; 
    bool answer = is_balanced(expression); 
    if(answer) 
     cout << "YES\n"; 
    else cout << "NO\n"; 
    return 0; 
} 

回答

2

您將3個開放式支架類型推入堆棧。但是,您的case語句正在檢查3個關閉類型,因此它總是返回傳入的內容,所以檢查將失敗。

開關邏輯所以它是這樣的:

char convert_bracket(char s) 
{ 
    switch(s) 
    { 
     case '(': s = ')'; 
        break; 
     case '[': s= ']'; 
        break; 
     case '{': s= '}'; 
        break; 
    } 
    return s; 
} 
+0

我還需要這些檢查堆棧大小:如果(bracketStack.size()> 0 &&小號== convert_bracket(bracketStack.top()))並且如果(bracketStack.size()== 0) { }返回true; } else { return false; } – Ben

1

你指的是Hackerrank挑戰吧?訣竅是在流程結束時檢查堆棧是否爲空。
最後你可以有平衡的括號和不完整的括號!