经典c程序(0027)---括号匹配

本文详细介绍了C语言中的括号匹配算法实现,包括函数定义、输入输出规范及样例解析,帮助读者理解并掌握如何通过编程解决括号配对问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**************************************************************************************   
* Function     : 括号匹配
* Create Date  : 2014/05/16 
* Author       : NTSK13   
* Email        : beijiwei@qq.com   
* Copyright    : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。   
*                任何单位和个人不经本人允许不得用于商业用途   
* Version      : V0.1                      
                    
题目: 经典c程序(0027)---括号匹配
	现在,有一行括号序列,请你检查这行括号是否配对。 
	输入 :
		第一行输入一个数N(0<N<=100),表示有N组测试数据。
		后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),
		测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符 

	输出 :
		每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 
	
	样例输入 :
				3
				[(])
				(])
				([[]()])
	样例输出 :
				No
				No
				Yes
**************************************************************************************/      
#include<stdio.h>      

// 测试数据可自由修改
#define COUNT	5
#define LENGTH	50

static char brackets_array[COUNT][LENGTH] = 
{
	"[(])",
	"(])",
	"([[]()])",
	"([[](((()[])))[[()]]](([[()]])))",
	"([[](((()[[])))[[()]]]](([[()]])))",
};

int run_test(char* pBracketString);

int main(void)
{
	int i = 0;
	for ( i = 0; i < COUNT; i++)
	{
		if (run_test(brackets_array[i]))
		{
			printf("Yes");
		}else
		{
			printf("No");
		}
		printf("\n");
	}
}


int run_test(char* pBracketString)
{
	char *ptmp=pBracketString;
	int  k=0,len=0;
	char stack[LENGTH/2]={'\0'};
	while(*ptmp !='\0')
	{
		ptmp++;
		len++;
	}
	//printf("len=%d  len%2=%d\n",len,len%2);
	if( len%2 )//长度为奇数
		return 0;
	else
	{
		ptmp=pBracketString;
		while(*ptmp !='\0')
		{
#if 1
			switch(*ptmp)
			{
				case '(':
				case '[':
					stack[k++]=*ptmp;
					break;
				case ')':
					if( stack[k-1] =='(' )
						stack[--k]='\0';
					else
						return 0;
					break;
				case ']':
					if( stack[k-1] =='[' )
						stack[--k]='\0';
					else
						return 0;
					break;
				default:
					break;
			}
			ptmp++;
		}
		if(stack[0]=='\0')
			return 1;
		else
			return 0;
#else	
			if( *ptmp=='(' || *ptmp=='['  )
			{
				stack[k++]=*ptmp;
				ptmp++;
				continue;
			}
		
			if( *ptmp==')' && stack[k-1] =='('  )
			{
				stack[--k]='\0';
				ptmp++;
				continue;
			}

			if( *ptmp==')' && stack[k-1] !='('  )
				return 0;

			if( *ptmp==']' && stack[k-1] =='['   )
			{	
				stack[--k]='\0';
				ptmp++;
				continue;
			}
			if( *ptmp==']' && stack[k-1] !='['   )
				return 0;
			
			ptmp++;
		}
		if(stack[0]=='\0')
			return 1;
		else
			return 0;
#endif
	
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值