c语言:括号匹配检测(栈的应用)

/*
	括号匹配检测,对于一串带括号的字符
	1.如果是左括号,入栈
	2.如果是右括号,与栈顶元素比较,
			若形成括号对,则栈顶左括号出栈;
			若不能形成括号对,则括号不能匹配
*/
# include <stdio.h>
# include <stdlib.h>

# define INIT_SIZE 6   //初始栈空间
# define INCRE_SIZE 2  //占空间增量

//栈结构
typedef struct
{
	char * base;  //指向栈空间基址
	char * top;  //指向栈顶元素的下一个位置
	int initsize;  //栈空间大小
}Stack;

Stack inital();  //初始化栈
void push(Stack &s, char ch);  //元素入栈
void pop(Stack &s, char &e);  //元素出栈
bool stack_empty(Stack s);  //判断栈是否为空

int main(void)
{
	Stack s = inital();
	char ch[20];
	char * p;
	char e;

	printf("请输入带括号的字符串:");
	gets(ch);	//输入字符
	p = ch;   //指向首字符

	while(*p)  //没有到串尾
	{
		switch(*p)
		{
			case '(':       
			case '[':
			case '{':
				push(s, *p); //左括号入栈
				p ++;      //读下一个字符
				break;

			case ')':
			case ']':
			case '}':
				pop(s, e);  //读入右括号,与栈顶的左括号e匹配
				if( !((e == '(' && *p == ')') || (e == '['  && *p == ']') || (e == '{' && *p == '}')))
				{
					printf("左右括号不能匹配\n");
					exit(0);
				}
				p ++;
				break;
			
			default:
				p ++;
		}
	}
	
	if(stack_empty(s))  //栈是否为空,为空,则匹配成功
	{
		printf("括号匹配成功\n");
	}
	else
	{
		printf("括号匹配失败\n");
	}

	return 0;
}

//初始化栈
Stack inital()
{
	Stack s;
	s.base = (char *)malloc(sizeof(char) * INIT_SIZE);
	s.initsize = INIT_SIZE;
	s.top = s.base;
	return s;
}

//入栈
void push(Stack &s, char ch)
{
	if(s.top - s.base >= s.initsize) //栈满,增加栈空间
	{
		s.base = (char *)realloc(s.base, sizeof(char) * (s.initsize + INCRE_SIZE));
		s.initsize = s.initsize + INCRE_SIZE;
	}

	*(s.top) = ch;
	s.top ++;
}

//出栈
void pop(Stack &s, char &e)
{
	if(stack_empty(s))
		return;
	else
	{
		e = *(s.top - 1);
		s.top --;
	}
}

//判断栈是否为空
bool stack_empty(Stack s)
{
	if(s.base == s.top)
		return true;
	else
		return false;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值