? ? ? ? ? ? ? ? ? ? ?话不多说,文中解释
?#include <stdio.h> ? ?int main() { ?char a[50]; ?? ?gets(a); ?? ?int flag=1;//定义flag做匹配与不匹配的判断? ?? ?int i=0,j;? ?? ? ?? ?for(i=0;a[i]!='\0';i++)//开始在字符串遍历中寻找右括号? ?? ?{ ? ?? ? ? if(a[i]==')') ?? ? ? { ? ?? ? ? ? ?flag=0;//找到一个右括号就设flag为0? ?? ??? ? ?for(j=i;j>=0;j--)//从找到右括号的地方向左寻找左括号? ? ? ? ? ? {?? ? ? ?? ?? ?? ??? ??? ? if(a[j]=='(') ?? ? ? ?? ? ? ? {flag=1;a[i]=1;a[j]=1;break;}//如果找到的左括号与其匹配,则flag转为1,同时消去左右括号 (为方便接下来的配对)? ?? ? ? ?? ? ? ? else if(a[j]=='{'||a[j]=='[') ?? ? ? ?? ? ? ? {break;} ?? ? ? ? ?} ?? ? ? } ?? ? ? ? if(a[i]=='}')//思路同上 ;? ?? ? ? { ?flag=0; ?? ??? ? ?for(j=i;j>=0;j--) ? ? ? ? ? {?? ? ? ?? ?? ?? ??? ??? ? if(a[j]=='{') ?? ? ? ?? ? ? ? {flag=1;a[i]=1;a[j]=1;break;} ?? ? ? ?? ? ? ? else if(a[j]=='('||a[j]=='[') ?? ? ? ?? ? ? ? {break;} ?? ? ? ? ?} ?? ? ? } ?? ? ? ? if(a[i]==']')//思路同上;? ?? ? ? { ?? ? ? ? ?flag=0; ?? ??? ? ?for(j=i;j>=0;j--) ? ? ? ? ? {?? ? ? ?? ?? ?? ??? ??? ? if(a[j]=='[') ?? ? ? ?? ? ? ? {flag=1;a[i]=1;a[j]=1;break;} ?? ? ? ?? ? ? ? else if(a[j]=='{'||a[j]=='(') ?? ? ? ?? ? ? ? {break;} ?? ? ? ? ?} ?? ? ? } ?? ??? ?if(flag==0){break;}//当发现左右括号不匹配时, 直接结束循环得出结论? ?? ?} ?? ? ? ?if(flag=1)//如果遍历结束后flag为1,再次遍历字符串检测是否仍有左括号存在; ?? ??? ? ? ? ? ? ?//因为在上面遍历过程中如果左括号数量多于右括号会导致左括号不会被消除完,这种情况当然也是不配对? ?? ??? ?{ ?? ??? ??? ?for(i=0;a[i]!='\0';i++) ?? ??? ??? ?{ ?? ??? ??? ?if(a[i]=='{'||a[i]=='('||a[i]=='[') ?? ??? ??? ? {flag=0;} ?? ??? ??? ?} ?? ??? ?} ?? ??? ? ?? ?if(flag==1)printf("yes");//最后打印? ?? ?else if(flag==0)printf("no"); ?? ?return 0; }
//? 该方法主要思路是寻找右括号后向前寻找并消除对应左括号,以达到不影响后续匹配的目的;本人初学C语言,也希望同各位初学者多多交流一下。
|