Почему моя программа на С ++ падает. Я проблема реализации сбалансированных скобок - PullRequest
1 голос
/ 25 апреля 2020

Я реализую проблему сбалансированных скобок для ранга хакера. ссылка Когда я запускаю свою программу на hackerrank ide, она показывает следующее предупреждение:

Solution.cpp: In function ‘std::__cxx11::string isBalanced(std::__cxx11::string)’:
Solution.cpp:51:17: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
                 if('{'!=s[i])
                 ^~
Solution.cpp:54:21: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
                     bracket.pop();
                     ^~~~~~~
Solution.cpp:25:16: error: control reaches end of non-void function [-Werror=return-type]
     stack<char>bracket;
                ^~~~~~~
cc1plus: some warnings being treated as errors

Когда я запускаю свою программу на локальном компьютере, моя программа падает после чтения целого числа (test case).
Для простоты кода я добавил комментарий к нему.
Проблема отображается в функции isBalanced().
Мой код:

#include <bits/stdc++.h>

using namespace std;

// return true if the passed character belongs to ar[], false otherwise
bool find(char ch,char ar[]){
    for(int i=0;i<3;i++)
        if(ar[i]==ch)
            return true;

    return false;
}


string isBalanced(string s) {
    int size=s.length();
    stack<char>bracket;
    char open[3]={'{','[','('};

    // if size of string is odd then expression is not balanced
    if(size%2!=0)
        return "NO";

    for(int i=0;i<size;i++){
    // if current bracket is opening bracket
    // then push it into bracket stack
    if(find(s[i],open)){
        bracket.push(s[i]);
    }
    // if current bracket is closing bracket
    // then match top element of bracket stack with current bracket
    // if both are matched then pop an element from bracket stack
    // if both are not matched return "NO"
    else{
        // if there is an element to match and current stack is empty then expression is not balanced
        if(bracket.empty())
        return "NO";

        else
        switch (bracket.top()) {
         case '{': 

                if('{'!=s[i])
                 return "NO";

                 bracket.pop();
             break;

        case '(':
        if('('!=s[i])
            return "NO";

        bracket.pop();
        break;

        case '[':
        if('['!=s[i])
            return "NO";

        bracket.pop();
        break;
        }

        bracket.pop();
    }
    return "YES";
}

}

int main()
{
    int t;
    cin >> t;
    for (int t_itr = 0; t_itr < t; t_itr++) {
        string s;
        getline(cin, s);
        string result = isBalanced(s);
        cout << result << "\n";
    }
    return 0;
}

1 Ответ

0 голосов
/ 25 апреля 2020

Две вещи:

  1. Не смешивайте getline и operator >>. Либо сделайте это:
int main()
{
    int t;
    cin >> t;
    cin.ignore();
    for (int t_itr = 0; t_itr < t; t_itr++) {
        string s;
        getline(cin, s);
        string result = isBalanced(s);
        cout << result << "\n";
    }
    return 0;
}

или сделайте это:

int main()
{
    int t;
    cin >> t;
    for (int t_itr = 0; t_itr < t; t_itr++) {
        string s;
        cin >> s;
        string result = isBalanced(s);
        cout << result << "\n";
    }
    return 0;
}

, в зависимости от того, что подходит вашему делу.

Ваша логика c несовершенна. Вот исправленная реализация isBalanced():
string isBalanced(string s) {
    int size=s.length();
    stack<char>bracket;
    char open[3]={'{','[','('};

    if(size%2!=0)
        return "NO";

    for(int i=0;i<size;i++){
        cout << i << endl;
        if(find(s[i],open)){
            bracket.push(s[i]);
        }
        else{
            if(bracket.empty())
                return "NO";
            else
            {
                switch (bracket.top()) {
                    case '{': 
                        if('}'!=s[i])
                            return "NO";
                        break;

                    case '(':
                        if(')'!=s[i])
                            return "NO";
                        break;

                    case '[':
                        if(']'!=s[i])
                            return "NO";
                    break;
                }
                bracket.pop();
            }
        }
    }
    return bracket.empty() ? "YES" : "NO";
}

Совет: пожалуйста, всегда делайте правильные отступы.

...