#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;
}

10-07 16:42