符号匹配函数

此段代码纯属实现功能要求,无优化之处。
//验证括号匹配,支持”()”、”[]”、”{}”三种括号
//要求: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;
    
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值