括号匹配 C语言实现

括号匹配

     给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效
【有效字符串需满足】
     1.左括号必须用相同类型的右括号闭合。
     2.左括号必须以正确的顺序闭合。
     3.注意空字符串可被认为是有效字符串。
【题目分析】:
    我们知道任何一种括号都是两两成对出现的,因此,再出现左括号是,必有有一个相匹配的右括号出现,但如果仅仅满足这个条件则不能正常的进行匹配,因为仅仅让出现数量相同是远远不够的,还需要让他们按照正确的顺序进行结合才行。因此,我们使用栈结构,利用其先进后出的特点将左括号压入,遇到右括号与栈顶元素比价,并且将其出栈。最后当栈空的同时结束遍历则说明匹配。具体代码入下:
首先简单构造一个栈

typedef char STDataType;
typedef struct stack
{
    
    
	STDataType* _data;
	int _size;
	int _capacity;//栈的容量
}stack;
void initStack(stack* st)//初始化栈
{
    
    
	if (st == NULL)
		return;
	st->_data = NULL;
	st->_capacity = st->_size = 0;
}
void checkCapacity(stack* st)//容量检查
{
    
    
	if (st->_capacity == st->_size)
	{
    
    
		
		int newCap = st->_capacity == 0 ? 1 : 2 * st->_capacity;
		st->_data = (STDataType*)realloc(st->_data, sizeof(STDataType)*newCap);
		
		st->_capacity = newCap;
	}
}
void stackpush(stack* st, STDataType val)//压栈
{
    
    
	if (st == NULL)
		return;
	checkCapacity(st);
	st->_data[st->_size++] = val;
}
void stackpop(stack* st)//出栈
{
    
    
	if (st == NULL || st->_size == 0)
		return;
	--st->_size;

}
STDataType stackTop(stack* st)//取栈顶元素
{
    
    
	if (st == NULL || st->_size == 0)
		return 0;
	return  st->_data[(st->_size) - 1];
}
int stackEmpty(stack* st)//判空
{
    
    
	if (st == NULL || st->_size == 0)
		return 1;
	else
		return 0;
}

在此基础上进行判断子程序:

//判断函数
bool isRight(char* s)
{
    
    
	//括号映射
	char map[3][2] = {
    
     {
    
     '(', ')' }, {
    
     '{', '}' }, {
    
     '[', ']' } };
	struct stack st;
	initStack(&st);
	while (*s)
	{
    
    
		int flag = 0;
		for (int i = 0; i < 3; ++i)//判断是否为左括号
		{
    
    
			if (*s == map[i][0])
			{
    
    
				stackpush(&st, *s);
				//判断下一个字符
				++s;
				flag = 1;
				break;
			}
		}
		if (flag == 0)
		{
    
    
			//取出栈顶元素,先判断栈是否为空
			if (stackEmpty(&st))
				return false;
			char topchar = stackTop(&st);
			stackpop(&st);
			for (int i = 0; i < 3; ++i)//判断与哪一个匹配
			{
    
    
				if (map[i][1] == *s)
				{
    
    
					if (map[i][0] == topchar)
					{
    
    
						//判断下一个字符
						++s;
						break;
					}
					else
						return false;//没有正确匹配
				}
			}
		}

	}
	//判断栈是否为空
	return stackEmpty(&st);
}

猜你喜欢

转载自blog.csdn.net/dream_i_success/article/details/111706239