#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
//***栈的应用之括号匹配***/
typedef struct
{
char data[MAXSIZE];
int top;
}*sqStack,sepStack;
sqStack initStack()//栈的初始化
{
sqStack s;
s=(sqStack)malloc(sizeof(sepStack));
s->top=0;
return s;
}
int push(sqStack s,char x)//进栈
{
if(s->top==MAXSIZE-1)
return 0;
s->data[s->top++]=x;
return 1;
}
int pop(sqStack s,char *x)//出栈
{
if(s->top==0)
return 0;
*x=s->data[--s->top];
return 1;
}
int getTops(sqStack s1,char ch)//从栈顶获取一个左括号
{
while(s1->top!=0)
{
pop(s1,&ch);
if(ch=='('||ch=='['||ch=='{')
return 1;
}
return 0;
}
int match(char ch1,char ch2)//判断当前右括号是否与从栈顶获取的左括号匹配
{
if((ch1=='('&&ch2==')')||(ch1=='{'&&ch2=='}')||(ch1=='['&&ch2==']'))
return 1;
else
return 0;
}
int isEmpty(sqStack s)//检测栈是否为空
{
if(s->top==0)
return 1;
else
return 0;
}
int parenthesisMatch(sqStack s)//括号匹配判断,如果匹配返回1,否则返回0
{
char str[100];
int i=0;
printf("Input a string.\n");
scanf("%s",str);
char a;
char ch;
sqStack s1=initStack();
for(i=0; str[i]!=0; i++)
{
switch(str[i])
{
case '{':
case '[':
case '(':
push(s,str[i]);
push(s1,str[i]);
break;
case '}':
case ']':
case ')':
getTops(s,ch);
if(match(ch,str[i]))
{
pop(s,&a);
}
}
}
if(isEmpty(s)==1)
return 1;
else
return 0;
}
int main()
{
sqStack s;
s= initStack();
printf("%d",parenthesisMatch(s)) ;
return 0;
}