

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

被折叠的 条评论
为什么被折叠?



