采用顺序栈实现的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int top;
}SqStack;
//初始化栈
SqStack InitStack(SqStack S)
{
S.top=-1;
return S;
}
//进栈
SqStack Push(SqStack S,int e)
{
S.data[++S.top]=e;
return S;
}
//出栈
SqStack Pop(SqStack S)
{
int e=S.data[S.top--];
return S;
}
//栈是否为空
int StackEmpty(SqStack S)
{
if(S.top==-1)
return 1;
else
return 0;
}
//栈是否满
int StackFull(SqStack S)
{
if(S.top==MaxSize-1)
return 1;
else
return 0;
}
//得到栈顶元素
int GetTop(SqStack S)
{
int e=S.data[S.top];
return e;
}
//获取括号字符
char *Get(char *p,int length)
{
char *q=(char *)malloc(sizeof(char)*100);
memset(q,0,100);
int i,j=0;
for(i=0;i<length;i++)
{
if(p[i]=='(' || p[i]=='{'|| p[i]=='['||
p[i]==')' || p[i]=='}'|| p[i]==']')
{
q[j]=p[i];
j++;
}
}
return q;
}
//判断括号表达式是否对称
int bracketCheck(char *p,int length)
{
SqStack S;
S=InitStack(S);
int i;
for(i=0;i<length;i++)
{
if(p[i]=='(' || p[i]=='{'|| p[i]=='[')
S=Push(S,p[i]);
else
{
if(StackEmpty(S))
return 0;
char topElem;
topElem=GetTop(S);
S=Pop(S);
if(p[i]==')' && topElem !='(')
return 0;
if(p[i]=='}' && topElem !='{')
return 0;
if(p[i]==']' && topElem !='[')
return 0;
}
}
return StackEmpty(S);
}
int main()
{
char a1[]="(1+2)*3-{(3-1)/2+[(2/5)-3]}";
char *p1=Get(a1,strlen(a1));
printf("%s-------%d\n",p1,strlen(p1));
if(bracketCheck(p1,strlen(p1)))
printf("合格\n");
else
printf("不合格\n");
char a2[]="(1+2)*3-(3-1)/2+[(2/5-3]}";
char *p2=Get(a2,strlen(a2));
printf("%s-------%d\n",p2,strlen(p2));
if(bracketCheck(p2,strlen(p2)))
printf("合格\n");
else
printf("不合格\n");
}
运行结果: