有两种方法:
第一种:数组
思想:观察可匹配成功的字符串可知:
找到第一个i为出括号(')',']')那么与它相匹配的进括号一定是在它左边i-1(最近的)
如果不是第一个出括号,与它相匹配的进括号一定是在它左边距离t对已匹配的括号(假设两者相隔t对已匹配的括号)可把已匹配的括号值设为0,那么只需找到第一个不为0的数是否与出括号匹配,如果不匹配说明该字符串不匹配)
([]), (([()]))) ,([()[]()])()
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<stdio.h> 5 #include<string.h> 6 #include<stack> 7 using namespace std; 8 int main() 9 { 10 int n; 11 // freopen("D:\\in.txt","r",stdin); 12 // freopen("D:\\out.txt","w",stdout); 13 cin>>n; 14 getchar(); 15 while(n--){ 16 int s[130]; 17 char mys[130]; 18 cin.getline(mys,sizeof(mys)); 19 int flagh=0; 20 int x1=0,x2=0,x3=0,x4=0; 21 for(int i=0;i<strlen(mys);i++) 22 { 23 if(mys[i]=='(') 24 s[i]=1,x1++; 25 if(mys[i]==')') 26 s[i]=-1,x2++; 27 if(mys[i]=='[') 28 s[i]=2,x3++; 29 if(mys[i]==']') 30 s[i]=-2,x4++; 31 } 32 if(x1!=x2||x3!=x4)//说明括号数量不匹配 33 flagh=1; 34 // for(int i=0;i<strlen(mys);i++) 35 // cout<<s[i]<<" "; 36 for(int i=0;i<strlen(mys);i++) 37 { 38 if(s[i]<0)//说明它是')'或者是‘]' 39 { 40 int flag=1,j; 41 for(j=i-1;j>=0;j--)//找到第一个不为0的数(另一个匹配的括号) 42 { 43 if(s[j]==0) 44 continue; 45 else{ 46 if(s[i]+s[j]!=0)//说明不匹配 47 { 48 flag=0; 49 } 50 break; 51 } 52 } 53 if(flag==0)//说明不符合 54 { 55 flagh=1; 56 break; 57 } 58 else//说明符合 把匹配的括号设为0 59 { 60 s[j]=0; 61 s[i]=0; 62 } 63 } 64 } 65 for(int i=0;i<strlen(mys);i++)//检查是否存在没匹配的字符(即不为0的数) 66 { 67 if(s[i]!=0) 68 { 69 flagh=1; 70 break; 71 } 72 } 73 // cout<<endl; 74 // for(int i=0;i<strlen(mys);i++) 75 // cout<<s[i]<<" "; 76 if(flagh==1) 77 cout<<"No"<<endl; 78 else 79 cout<<"Yes"<<endl; 80 } 81 // 82 //fclose(stdin); 83 //fclose(stdout); 84 }
第二种:栈
1)栈的思想
#include<stdio.h> #include<string.h> int main() { int i,j,k,T; int flag; int s[135],st,top; char c[135]; scanf("%d",&T); getchar(); while(T--) { fgets(c,sizeof(c),stdin); flag=0; j=0; for(i=0; c[i]!='\n'; i++) { if(c[i]=='(') s[j++]=0; else if(c[i]=='[') s[j++]=1; else if(c[i]==')') { if(j!=0 && s[j-1]==0) j--; else { flag=1; break; } } else if(c[i]==']') { if(j!=0 && s[j-1]==1) j--; else { flag=1; break; } } // else // { // flag=1; // break; // } } if(flag==1|| j!=0) printf("No\n"); else printf("Yes\n"); } return 0; }