ниже я загрузил код, чтобы проверить, сбалансированы ли скобки в строке или нет стеков. Он работает для 1 входа, но для нескольких тестовых случаев правильный вывод не работает. ПОЖАЛУЙСТА, ПОМОГИТЕ.
int main()
{
int t;
cin >>t;
cin.ignore();
while(t--)
{
{
stack s;
char *st;
st=new char[100];
gets(st);
s.create(strlen(st));
if(!count_elem(st))//counts if the brackets are in pairs or not
cout << "NO" <<endl;
else
func1(s,st);
}
}
return 0;
}void func1(stack s,char *st)
{
static int i=0,flag=0;
// printf("%d %d\n",i,flag);
if(st[i]=='(' || st[i]=='{' || st[i]=='[')
{
flag=1;
s.push(st[i]);
}
else
{
if(s.isEmpty())
flag=0;
else
{
if(st[i]=='}')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='{')
{
flag=1;
s.pop();
}
else
flag=0;
}
if(st[i]==')')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='(')
{
flag=1;
s.pop();
}
else
flag=0;
}
if (st[i]==']')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='[')
{
flag=1;
s.pop();
}
else
flag=0;
}
}
}
i++;
if(flag==1)
{
if(i<strlen(st))
func1(s,st);
else
cout << "YES"<<endl;
}
else
cout << "NO"<< endl;}
Проблема в том, что … когда программа переходит от одного тестового примера к другому, она не инициализирует заново i = 0, flag = 0 …, поскольку они были объявлены как статические переменные. Что можно сделать вместо этого … i, глобально помечать …. и назначать i = 0; flag = 0; перед первым вызовом функции func () для каждого теста ….
int main()
{
int t;
cin >>t;
cin.ignore();
while(t--)
{
{
stack s;
char *st;
st=new char[100];
gets(st);
s.create(strlen(st));
if(!count_elem(st))
cout << "NO" <<endl;
else
{
i=0;
flag=0;
func1(s,st);
}delete []st;
}
}
return 0;
}
Других решений пока нет …