括号配对问题

来源:互联网 发布:java传递参数基本类型 编辑:程序博客网 时间:2024/06/05 21:03

题目:

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3[(])(])([[]()])
样例输出
NoNoYes
来源
网络
上传者

naonao


心得:代码写好后经常要检查括号是否匹配,我总是从里往外检查,如下面这一行括号[()[]([])],我的检查顺序如下[()[]([])]--->[[]([])]--->[([])]--->[()]--->[]--->    。其过程即为寻找最里层匹配的,即相邻位是相匹配的括号,然后删除这对括号,重复以上动作,若找不到相匹配的,则整个字符串中的括号都不匹配。



代码<C语言>


 #include<stdio.h>
#include<string.h>
int main()
{
  char a[10005];
  int n,k,m,i;
  scanf("%d",&m);//输入循环的次数
  while(m--)
 {
     scanf("%s",&a);//输入字符串
     n=strlen(a);//字符串长度,不包括'\0'
     if(n%2!=0)//如果字符串长度是奇数
   { 
      printf("No\n");
   }
    else{
        do{
             k=-1;//每次都初始化k为-1
             for(i=0;i<n-1;i++)//遍历数组
             {
                 if((a[i]=='('&&a[i+1]==')')|| (a[i]=='['&&a[i+1]==']'))//如果相邻位匹配
                 {
                        k=i;//标记一下位置
                        break;
                  }
             }
           if(k<n-1&&k!=-1)//表示k是被标记过的
          {
             for(i=k;i<n-2;i++)//在k的位置向前挪两位,即覆盖这两个匹配成功的括号
             {
                 a[i]=a[i+2];
             }
             n=n-2;//新的字符串的长度减少2个
          }
         else//找不到相邻位匹配的
         {

            printf("No\n");
            break;},结束循环
      }while(n!=0);//当字符串中字符个数不为0时
    if(n==0)
      printf("Yes\n");
}
}
return 0;
}




AC情况:




原创粉丝点击