用栈检测括号匹配的代码是什么?

2025-04-30 01:55:15
推荐回答(1个)
回答1:

#include
#include

#define MaxSize 100

typedef char ElemType;//定义数据类型

//定义顺序栈
typedef struct
{
ElemType data[MaxSize];//数据域
int top;//栈顶指针
}SeqStack;

//栈初始化
int InitStack(SeqStack *s)
{
s->top=-1;//初始化栈顶,指向空
return 1;
}

//入栈
int Push(SeqStack *s,ElemType x)
{
if (s->top == MaxSize -1 )
{
printf("栈已满,不能入栈.\n");
return 0;
}
else
{
s->top++;//栈顶指针上移
s->data[s->top] = x;//数据元素入栈
}
return 1;
}

//出栈
int Pop(SeqStack *s,ElemType *x)
{
if (s->top == -1)
{
printf("栈为空,不能出栈.\n");
return 0;
}
else
{
*x=s->data[s->top];//取出栈顶元素值
s->top--;//栈顶指针下移
}
return 1;
}

//取栈顶值
int GetTop(SeqStack *s,ElemType *x)
{
if (s->top == -1)
{
printf("栈为空,不能取值.\n");
return 0;
}
else
{
*x=s->data[s->top];//取出栈顶元素值
}
return 1;
}

//判断栈是否为空
int IsEmpty(SeqStack *s)
{
if(s->top==-1)
return 1;

return 0;
}

int Check(char str[],int len)
{
int i;
int flag=1;//合法标志0-不合法 1-合法
int exist=0;//小括号存在标志 0-不在 1-在
ElemType x;
SeqStack s;//栈s

//栈初始化
InitStack(&s);

for(i=0;i {
if(str[i]=='{')//大括号{
{
if(IsEmpty(&s))//栈空,直接入栈
{
if(Push(&s,str[i])!=1)
{
flag=0;
break;
}
}
else//栈非空,判断合法性
{
if(GetTop(&s,&x)!=1)//取栈顶值
{
flag=0;
break;
}
if(x=='{' || x=='[' || x== '(')//如果是{,[或者(,非法
{
flag=0;
break;
}
else//否则入栈
{
if(Push(&s,str[i])!=1)
{
flag=0;
break;
}
}
}
}
else if(str[i]=='[')//方括号[
{
if(IsEmpty(&s))//栈空,直接入栈
{
if(Push(&s,str[i])!=1)
{
flag=0;
break;
}
}
else//栈非空,判断合法性
{
if(GetTop(&s,&x)!=1)//取栈顶值
{
flag=0;
break;
}
if(x=='[' || x== '(')//如果是[或者(,非法
{
flag=0;
break;
}
else//否则入栈
{
if(Push(&s,str[i])!=1)
{
flag=0;
break;
}
}
}
}
else if(str[i]=='(')//小括号(
{
//直接入栈
if(Push(&s,str[i])!=1)
{
flag=0;
break;
}
exist=1;//小括号存在
}
else if(str[i]==')')//小括号)
{
if(Pop(&s,&x)!=1)
{
flag=0;
break;
}
if(x!='(')//如果出栈非(,非法
{
flag=0;
break;
}
}
else if(str[i]==']')//方括号]
{
if(Pop(&s,&x)!=1)
{
flag=0;
break;
}
if(x!='[')//如果出栈非[,非法
{
flag=0;
break;
}
if(exist==0)//小括号不存在,单独[],非法
{
flag=0;
break;
}
}
else if(str[i]=='}')//大括号}
{
if(Pop(&s,&x)!=1)
{
flag=0;
break;
}
if(x!='{')//如果出栈非{,非法
{
flag=0;
break;
}
if(exist==0)//小括号不存在,单独[],非法
{
flag=0;
break;
}
}
else//其它字符跳过
continue;
}

if(!IsEmpty(&s))//循环完毕,栈非空,非法
flag=0;

return flag;

}
//主函数
int main(void)
{
char str[MaxSize];//录入字符串
int i,len;

while(1)
{
printf("输入字符串\n");
gets(str);
len=strlen(str);
if(len>=MaxSize)//超过定义长度
return 1;

if(Check(str,len)==1)
printf("匹配合法!\n");
else
printf("不合法\n");

printf("是否继续? 1-是,0否 :");
if(scanf("%d",&i)!=1 || i!=1)
break;
fflush(stdin);
}

return 0;
}