3 [(]) (]) ([[]()])
No No Yes
1.按数据结构书上的来,好麻烦,不推荐
#include<stdio.h> #include<stdlib.h> typedef struct{ char m[10000]; int last; }Seqlist; void Inlist(Seqlist *L){ L->last=-1;} //空栈 void push(Seqlist *L,char num){ L->m[++(L->last)]=num;} //输入 void pop(Seqlist *L,char *num){ *num=L->m[L->last]; L->last--; } //删栈顶 int isempty(Seqlist *L){ return (L->last==-1?1:0); } // yes or no int main() { char tem,t; char *tt=&t; int i,ll[5],k=-1,h,flag=1; //i是测试组数 ll[5]记录yes no Seqlist L; //顺序表L Inlist(&L); ////建栈 scanf("%d",&i); //输入测试组数 if(i>5) return 0; //测试不超过5组 while(i-->0) { flag=1; while(L.last!=-1) pop(&L,tt); fflush(stdin); //清除输入缓冲区 while((tem=getchar())!='\n') { if(isempty(&L)) { if(tem!='('&&tem!='[') { ll[++k]=0; flag=0;break; } else push(&L,tem); }//empty else if(tem==')') { pop(&L,tt); if(*tt!='(') { ll[++k]=0; flag=0;break; } } else if(tem==']') { pop(&L,tt); if(*tt!='[') { ll[++k]=0; flag=0;break; } } else if(tem=='['||tem=='(') push(&L,tem); }//while1 if(flag) { if(isempty(&L)) ll[++k]=1; else ll[++k]=0; } } for( h=0;h<=k;h++) { if(ll[h]==0)printf("No\n"); if(ll[h]==1) printf("Yes\n"); } return 0; }
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char a[10100],b[10100]; int n,len,i,top; scanf("%d",&n); while(n--) { scanf("%s",a); len=strlen(a); top=1; b[0]=a[0]; //头结点 for(i=1;i<len;i++) //i从1开始入值 { if(a[i]=='('||a[i]=='[') b[top++]=a[i];//进栈 if(a[i]==')') { if(b[top-1]=='(') //易错点!!! top--;//移动栈顶下标 else b[top++]=a[i]; } if(a[i]==']') //重复 { if(b[top-1]=='[') top--; else b[top++]=a[i]; } } if(top==0) //最后的栈顶下标值值,此时括号全部配对完成 printf("Yes\n"); else printf("No\n"); } return 0; }
3.简化代码:
#include<stdio.h> #include<string.h> int main(){ int n,i,flag; char a[10005]; scanf("%d\n",&n); while(n--){ flag=1; memset(a,0,sizeof(a)); scanf("%c",&a[0]); i=1; while(scanf("%c",&a[i])&&(a[i]=='['||a[i]==']'||a[i]=='('||a[i]==')' ) ){//进栈 if(a[i]==']') if(a[i-1]=='[') i-=2;//配对成功,一对成功,就不用放在栈里了,腾位子给还没配对的 else flag=0; //配对失败,No if(a[i]==')') if(a[i-1]=='(') i-=2; //配对成功,一对成功,就不用放在栈里了,腾位子给还没配对的 else flag=0; //配对失败,No i++;//若输入为 ‘[ ’或 ‘( ’ ,没有配对 } if(flag==1&&i==0) printf("Yes\n");//配对一直成功,并且 全部配完Yes else printf("No\n");//其他No } return 0; }