c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

本文介绍如何使用C语言中的栈数据结构来检测括号是否正确匹配。通过逐个读取字符并根据其类型进行相应的入栈或出栈操作,最终判断括号序列是否合法。

//c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

/*
初始化栈
初始化标志位
循环标志位不为1
{
   输入一个字符并判断是否为括号
   如果是<[{(则进栈
   如果是>]})则出栈
   {
      判断出栈的字符和输入的字符是否相等
	  {
	      相等则继续
		  否则标志位为0
	   }
   }
   判断栈空否
   {
      栈空则标志位为0
   }
}
判断栈空的情况
{
   栈空匹配
   否则不匹配
}
*/


//---------头文件----------
#include<stdio.h>
#include<stdlib.h>

//---------宏定义----------

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//---------替换和结构体-----------

typedef int Bool;
typedef struct
{
	int *base,*top;
	int stacksize;
}SqStack,*Stack;

//--------函数列表--------
Bool InitStack(Stack s);
Bool StackEmpty(Stack s);
Bool Push(Stack s,char e);
Bool Pop(Stack s,char *e);

//--------主函数---------

void main()
{
	SqStack sq,*s=&sq;
	int flag=0;
	char ch,e;
	InitStack(s);
	while('\n'!=(ch=getchar()))
	{
		if('('==ch||'['==ch||'{'==ch||'<'==ch)
		{
			Push(s,ch);
		}
		if(')'==ch||']'==ch||'}'==ch||'>'==ch)
		{
			Pop(s,&e);
			if(('('==e&&')'==ch)||('{'==e&&'}'==ch)||('['==e&&']'==ch)||('<'==e&&'>'==ch))
			{
				flag=1;
			}
			else
			{
				flag=0;
			}
		}
	}
	if(1==flag&&StackEmpty(s))
	{
		printf("括号匹配!检测结束.\n");
	}
	else
	{
		printf("括号不匹配!检测结束.\n");
	}
	getchar();
	getchar();
}

//--------其余函数--------

Bool InitStack(Stack s)
{
	if(!(s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))
	{
		exit(OVERFLOW);
	}
	s->top=s->base;
	s->stacksize=STACK_INIT_SIZE;
	return TRUE;
}

Bool StackEmpty(Stack s)
{
	return s->base==s->top?TRUE:ERROR;
}

Bool Push(Stack s,char e)
{
	if(s->top-s->base>=s->stacksize)
	{
		if(!(s->base=(int *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int))))
		{
			exit(OVERFLOW);
		}
		s->top=s->base+s->stacksize;
		s->stacksize+=STACKINCREMENT;
	}
	*(s->top++)=e;
	return TRUE;
}

Bool Pop(Stack s,char *e)
{
	if(s->base==s->top)
	{
		return ERROR;
	}
	*e=*(--s->top);
	return TRUE;
}


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值