2017-09-07 4 views
-1

C++でバランスブラケットコードを作成しようとしています。私は2つの機能、is_balancedconvert_bracketを持っています。基本的にis_balancedでは、左括弧をスタックに追加し、対応する右括弧が文字列に現れたときにそれらをポップします。しかし、何らかの理由で、s = '('bracketStack.top() == ')'(convert_bracketは'('に変換されます)でも常にs == convert_bracket(bracketStack.top())が失敗します。アイテムをスタックから取り除くことができるように、この条件を渡す必要があります。アドバイスを受けることはできますか?スタック: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つのclose型をチェックしているので、渡されたものが常に返されるので、チェックは失敗します。

スイッチロジックのこのようなので、私はまた、スタックサイズをチェックするためにこれらを必要と

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

:もし(bracketStack.size()> 0 && S == convert_bracket(bracketStack.top())) if(bracketStack.size()== 0) { がtrueを返します。 } else { falseを返します。 } – Ben

1

あなたはHackerrankのチャレンジを正しく参照していますか?トリックは、プロセスの最後にスタックが空であるかどうかを確認することです。
最後にブラケットと不完全な角括弧を使用できます。

関連する問題