Правильная скобочная последовательность 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 шт):
Вобщем, кроме ошибки с проверкой 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");
}