描述现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
- 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
- 样例输入
-
3 [(]) (]) ([[]()])
- 样例输出
-
No No Yes
配对问题: 另备一个数组存在两者中的其中一者,然后利用该数组(越晚存入的其中一种种类)与原数组(越早出现的另一种类) 进行消对。如果在原数组遍历结束时 刚刚好消完则配对成功,否则要么出现备用数组提前用完(j<0) 要么出现备用数组没消亡(j>0)
#include<stdio.h>
#include<string.h>
int main()
{
char s[10002],c[10002];
int i,N,len,j,flag;
scanf("%d",&N);
while(N--)
{
scanf("%s",s);
len=strlen(s);
for(i=0,j=0,flag=1;i<len;i++)
{
if(s[i]==‘[‘ || s[i]==‘(‘ )
{
c[j++]=s[i];(相当于c[j]=s[i] j++) ///将其中一个种类存入备用数组
}
else if(j>0 && ( (s[i]==‘]‘ && c[j-1]==‘[‘) || (s[i]==‘)‘ && c[j-1]==‘(‘) ) ) ////进行消对
{
j--;
}
else/////////出现不配对情况 如 [ 与 )
{
flag=0;
break;
}
}
if(flag==1&&j==0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}return 0;
}另外知识:在循环判断条件中加入flag条件 有利于提前终止 不必要的循环(只要有一个不符合 后面就不需要检验).比如素数判断
k=sqrt(n);
如 for(i=2;flag==1&&i<=k;i++)
{
if(n%i==0) flag=0;
}
当然也可以直接break;