Правильная скобочная последовательность C++ задача

Правильная скобочная последовательность Рассмотрим последовательность, состоящую из круглых, квадратных и фигурных скобок. Программа должна определить, является ли данная скобочная последовательность правильной.

Пустая последовательность является правильной. Если A правильная, то последовательности (A) , [A] , {A} правильные. Если A и B правильные последовательности, то последовательность AB правильная.

Входные данные

В единственной строке записана скобочная последовательность, содержащая не более 100000 скобок.

Выходные данные

Если данная скобочная последовательность правильная, то программа должна вывести строку yes, иначе — строку no.

Примеры Ввод ([])

Вывод yes

Ввод {)

Вывод no

у меня не проходит несколько тестов, с чем это может быть связано? код снизу

#include <iostream>
#include <string>
#include <stack>

using namespace std;

int main()
{
stack<long long>st;
string c;
getline(cin, c);
for(auto s : c)
{
    if((s == ']' || s == ')' || s == '}') && st.empty()){
        st.push(1);
    }
    else if(s == '{' || s == '(' || s == '[')
    {
        st.push(s);
    }
    else if(s == ')' && st.top() == '(' && !st.empty())
    {
        st.pop();
    }
    else if(s == '}' && st.top() == '{' && !st.empty())
    {
        st.pop();
    }
    else if(s == ']' && st.top() == '[' && !st.empty())
    {
        st.pop();
    }
}
 if(st.size() > 0)
 {
   cout<<"no";
 }
 else{
  cout<<"yes";
}

}

Ответы (1 шт):

Автор решения: Harry

Вобщем, кроме ошибки с проверкой st.empty(), зря вы не выходите сразу, как становится понятно, что последовательность неверна.

Я тут немного переписал, используя исключение, но можно и иначе, например, с помощью флага — лишь бы смысл сохранился...

int main()
{
    stack<char> st;
    string s;
    getline(cin, s);
    try {
        for(auto c : s)
        {
            switch(c)
            {
            case '[':
            case '{':
            case '(': st.push(c); break;
            case ']': {
                if (st.empty() || st.top() != '[') throw 1;
                st.pop();
                break;
            }
            case '}': {
                if (st.empty() || st.top() != '{') throw 1;
                st.pop();
                break;
            }
            case ')': {
                if (st.empty() || st.top() != '(') throw 1;
                st.pop();
                break;
            }
            }
        }
    } catch(...)
    {
        cout<<"no";
        return 0;
    }
    cout << (st.empty() ? "yes" : "no");
}

Или, например, так...

#include <iostream>
#include <string>
#include <cstring>
#include <stack>

using namespace std;

int main()
{
    const char * open  = "[{(";
    const char * close = "]})";
    stack<char> st;
    string s;
    getline(cin, s);
    for(char c: s)
    {
        if (strchr(open,c)) st.push(c); 
        else if (const char * cp = strchr(close,c); cp)
        {
            if (st.empty() || ((strchr(open,st.top()) - open) != (cp - close))) 
            { st.push(c); break; }
            st.pop();
        }
    }
    cout << (st.empty() ? "yes" : "no");
}
→ Ссылка