/*括号匹配算法*/
#include<stdio.h>
#define FALSE 0
#define TRUE 1
#define MAXSIZE 100
typedef char DataType;
//定义栈
typedef struct stack{
    DataType data[MAXSIZE];
    int top;
}SeqStack;
//初始化栈
void InitStack(SeqStack *s)
{
    s->top = -1;
}
//判断栈是否为空
int IsEmpty(SeqStack *s)
{
    if(s->top == -1)
        return TRUE;
    return FALSE;
}
//判断栈是否已满
int IsFull(SeqStack *s)
{
    if(s->top == MAXSIZE-1)
        return TRUE;
    return FALSE;
}
//出栈
void PopStack(SeqStack *s, DataType temp)
{
    if(IsEmpty(s))
        return;
    temp = s->data[s->top];
    s->top --;
}
//压栈
void PushStack(SeqStack *s,DataType temp)
{
    if(IsFull(s))
        return;
    s->top ++ ;
    s->data[s->top]=temp;
}
//判断两个括号是否匹配
int Match(char chone,char chtwo)
{
    if(chone=='(' && chtwo==')')
        return TRUE;
    else if(chone == '{' && chtwo == '}')
        return TRUE;
    else if(chone == '[' && chtwo == ']')
        return TRUE;
    else
        return FALSE;
}
//取栈顶元素
void GetTopStack(SeqStack *s , DataType *temp)
{
    if(IsEmpty(s))
        return;
    *temp = s->data[s->top];
}
void BracketMatch(char *str)
{
    SeqStack s;
    int i;
    char ch;
    InitStack(&s);
    for(i=0 ; str[i]!='\0';i++ )
    {
        switch(str[i]){
        case '(':
        case '[':
        case '{':
            PushStack(&s,str[i]);
            break;
        case ')':
        case ']':
        case '}':
            if(IsEmpty(&s))
            {
                printf("右括号多余\n");
                return;
            }else{
                GetTopStack(&s,&ch);
                if(Match(ch,str[i]))
                    PopStack(&s,ch);
                else{
                    printf("\n对应的右括号不同类\n");
                    return;
                }/*if*/
            }/*else*/
        }/*for*/
    }/*switch*/
    if(IsEmpty(&s))
        printf("\n括号匹配\n");
    else
        printf("\n左括号多余\n");
}
int main()
{
    char str[MAXSIZE];
    int i;
    printf("Input the bracket string: \n");
    scanf("%s",str);
    BracketMatch(str);
    return 1;
}