//使用堆栈实现括号的匹配
#include <string.h>
#include<stdio.h>
typedef char DataType;
#define MaxSize 10
typedef struct
{
DataType stack [MaxSize];
int top;
}sstack;
//堆栈的初始化
void StackInit(sstack *s)
{
s->top=0; //定义指针变量,他指向的变量的成员变量为0;
}
//插入数据
int StackInsert(sstack*s,DataType x)
{
if(s->top>MaxSize)
{
printf("堆栈已满不能插如");
return 0;
}
else
{
s->stack[s->top]=x;
s->top++;
return 1;
}
}
//判断堆栈是否为空
int StackNe(sstack s)
{
if(s.top<=0)
{
return 0;
}
else
{
return 1;
}
}
//出栈
int StackDelete(sstack *s,DataType *x)
{
if(s->top<=0)
{
printf("堆栈为空");
return 0;
}
else
{ s->top--;
*x=s->stack[s->top];
return 1;
}
}
//取出栈顶元素
int StackGet(sstack s, DataType *x)
{
if(s.top<0)
{
printf("堆栈为空");
return 0;
}
else
{
*x=s.stack[s.top-1];
return 1;
}
}
//函数实现括号的匹配
void pipei(char ele[],int n)
{ int i;
sstack mystack;
char c;
//初始化栈
StackInit(&mystack);
for(i=0;i<n;i++)
{
//如果是左括号则入栈
if((ele[i]=='{')||(ele[i]=='[')||(ele[i]=='('))
{
StackInsert(&mystack,ele[i]) ;
}
//如果是有括号则进行匹配,如果不是空的而且是在栈顶则出栈,说明他们是匹配的。
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='(')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
printf("()\t");
}
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='(')
{
printf("括号匹配不正确\n");
return ;
}
//[][][][][][]]]]]]]][[[[[[[[[[[[[[]]]]]]]]]]]]][[[[[[[[[[]]]]]
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='[')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号是匹配的");
printf("[] \t");
}
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='[')
{
printf("括号匹配不正确 \n");
return ;
}
//{ { { { { { { { { { { {}}}}}}}}}}}}}}}}}}}}{ { { { { { { { { { { { { { { { { { { { { {}}}}}}}}}}}}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='{')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号匹配真确 \n");
printf("{} \t");
}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='{')
{
printf("括号匹配不正确 \n");
return ;
}
else if((ele[i]==')')||(ele[i]==']')||(ele[i]=='}')&&!StackNe(mystack))
{
printf("右括号多于左括号! \n");
}
}
if(StackNe(mystack))
{
printf("左括号多于右括号! \n");
}
else
{
printf("括号匹配正确!\n");
}
}
int main ()
{
char a[]={'{','[','(',')',']','}'} ;
char b[]={'{','{','[','(',')',']','}'};
pipei(b,10);
return 0;
}