此段代码纯属实现功能要求,无优化之处。
//验证括号匹配,支持”()”、”[]”、”{}”三种括号
//要求:a.可以只有”()” b.”()”不能包含”()”、”[]”、”{}”
// C.”[]”不能包含”[]”、”{}” d.如果有”[]”,必须有”()”被包含在内
// e. 如果有”{}”,必须有”[]”被包含在内 f.”{}”中可以有”{}”
#include<stdio.h>
#include<string.h>
int match(const char *strInput)
{
//printf("Hello");
//printf("%s\n",str1);
#ifdef DEBUG
if(NULL==strInput)
return 0;
#endif
int k=strlen(strInput);
int tag10;//'('
int tag11;//')'
int tag20;//'['
int tag21;//']'
int tag30;//'{
int tag31;//'}'
int flag1=0;
int flag2=0;
int flag3=0;
int result=1;
while(*strInput)
{
if((('a'<=*strInput)&&('z'>=*strInput))||'+'==*strInput||'-'==*strInput||'*'==*strInput||'/'==*strInput)
{
strInput++;
}
else
{
//printf("Hello\n");
switch(*strInput)
{
case '(':{
if(tag10!=tag11) result=0;//解决()自身不能包含自身的问题。
flag1=0;//当[]出现后就必须出现();这样解决了str10的情况。
flag2=0;
tag10++;
break;
}
case ')':{
tag11++;
break;
}
case '[':{
if(tag10!=tag11) result=0;//[]匹配后()必须相等
if(tag20!=tag21) result=0;//解决[]自身不能包含自身的问题。
flag1=1;//当[]出现后就必须出现();这样解决了str10的情况。
flag3=0;//当{}出现后就必须其中必须出现[];而[]其中必须出现(),这个由flag1解决。
tag20++;
break;
}
case ']':{
tag21++;
if(1==flag1)
result=0;//为了测试str11的情况。
break;
}
case '{':{
if(tag10!=tag11) result=0;
if(tag20!=tag21) result=0;
tag30++;
flag2=1;//当{}出现后就必须其中必须出现[];
flag3=1;//必须符合{[()]}
break;
}
case '}':{
tag31++;
if(1==flag2)
result=0;
if(1==flag3)
result=0;
break;
}
default:
printf("你输入的字符串有误,请重新执行程序并输入!\n");
exit(0);//直接退出程序,即main函数;
//而return语句是退出当前函数。
}
strInput++;
}
}
if(tag10!=tag11||tag20!=tag21||tag30!=tag31)
result=0;
//这上面三句可先解决()个数相对应匹配。比如str3的情况
if(1==flag1)
result=0;
if(1==flag2)
result=0;
if(1==flag3)
result=0;//这上面三句同样可向前面一句那样合并,不过为体现思路,暂不合并
if(0==result)
printf("No match it\n");
else
printf("Match it\n");
return 0;
}
int main()
{
char str1[30]={0};
char str2[30]={"{{[(a+b)/(d*c)]}}"};
char str3[30]={"(a+b))/c"};
char str4[30]={"((a+b))"};
char str5[10]={"([a+b])"};
char str6[10]={"({a+b})"};
char str7[10]={"[{a+b}]"};
char str8[10]={"[[a+b]]"};
char str9[11]={"({a+b})"};
char str10[20]={"(a+b)/[a+b]"};
char str11[20]={"[a+b]/(a+b)"};
char str12[20]={"{[a+b]}"};// 如果有”[]”,必须有”()”被包含在内
char str13[20]={"{(a+b)}"};//如果有”{}”,必须有”[]”被包含在内
char str14[20]={"{a+b}(a+b)"};
char str15[20]={"{a+b}[(a+b)]"};
match(str2);
match(str3);
match(str4);
match(str5);
match(str6);
match(str7);
match(str8);
match(str9);
match(str10);
match(str11);
match(str12);
match(str13);
match(str14);
match(str15);
printf("Please input:\n");
scanf("%s",str1);//注意这里的str1本身就是个地址,不要再取地址操作符。也不要加换行符'\n'
printf("%s\n",str1);
match(str1);
printf("Hello");//测试语句exit(0)执行后是否执行该句;
return 0;
}