括号配对问题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述 现在,有一行括号序列,请你检查这行括号是否配对。
输入第一行输入一个数N(0
#include <stdio.h>
#include <string.h>
int main()
{
int i,n,top=-1,flag=0; //栈初始化为-1
char a[10000],s[10000];
scanf("%d",&n); //输入n
while(n--) //先判断n是否大于0,若大于零,减一之后进入循化
{
scanf("%s",a); //输入字符串
for(i=0,top=-1,flag=0;a[i]!='\0';i++)
{
if(a[i]=='('||a[i]=='[') //当a[i]为(或[时,入栈
s[++top]=a[i];
else if(a[i]==')') //判断栈内是否有对应的左括号
{
if(s[top]=='(')
top--;
else if(top==-1||s[top]!='(')
{
flag=1; /*当不匹配时 flag=1,退出循环,方便判断*/
break;
}
}
else if(a[i]==']')
{
if(s[top]=='[')
top--;
else if(top==-1||s[top]!='[')
{
flag=1;
break;
}
}
}
if(top==-1&&flag==0)/*如果top=-1说明匹配,但此时出现了另一种特殊情况[[]]]]。此时top=-1,但显然不配对,所以我用flag来增强判断,如果flag=1,说明中途退出了循环,即break。所以当两种情况都满足时,方可判断配对*/
printf("Yes\n");
else //top!=-1或者flag=1 说明不配对
printf("No\n");
}
return 0;
}