堆栈:C ++中的平衡括号失败

时间:2017-09-07 17:29:26

标签: c++

我正在尝试用C ++创建平衡括号代码。我有两个功能,is_balancedconvert_bracket。基本上,在is_balanced中,我将左括号添加到堆栈中,并在字符串中出现相应的右括号时将其弹出。但是,由于某些原因,s == convert_bracket(bracketStack.top())即使s = '('bracketStack.top() == ')'(convert_bracket会将其转换为'(')也始终失败。我需要通过此条件才能将项目从堆栈中取出。我可以得到任何建议吗?

#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 个答案:

答案 0 :(得分:2)

将3个开放式括号类型推入堆栈。但是,您的case语句正在检查3个close类型,因此它总是返回传入的内容,因此检查将失败。

切换逻辑,如下所示:

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

答案 1 :(得分:1)

您指的是Hackerrank挑战吗?诀窍是在进程结束时检查堆栈是否为空。
你最后可以使用平衡括号和不完整的括号!