数据结构实验之栈与队列四:括号匹配

Problem Description

 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。

 

Input

 输入数据有多组,处理到文件结束。

 

Output

 如果匹配就输出“yes”,不匹配输出“no”

 

Sample Input

sin(20+10)
{[}]

Sample Output

yes
no

#include
#include
#include
#define stackmax 10000
#define stacknum 10000
typedef int Elemtype;
typedef struct
{
    Elemtype *base;
    Elemtype *top;
    int stacksize;
}Sqstack;
void Initstack(Sqstack *S)
{
    S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
    if(!S->base) exit(0);
    S->top=S->base;
    S->stacksize=stackmax;
}//栈的初始化
void Push(Sqstack *S,char n)
{
    if(S->top-S->base>=S->stacksize)
    {
        S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
        if(!S->base) exit(0);
        S->top=S->base+S->stacksize;
        S->stacksize=S->stacksize+stacknum;
    }
    *(S->top)=n;//栈顶元素先赋值
    S->top++;//栈顶指针加一,栈顶指针上移
}//入栈操作
char Pop(Sqstack *S)
{
    char e;
    if(S->top==S->base) return -1;
    e=*(S->top-1);
    S->top--;
    return e;
}//出栈操作
int Empty(Sqstack *S)
{
    if(S->base==S->top) return -1;
    else return 1;
}//判空操作
int GetTop(Sqstack *S)
{
    if(S->top==S->base) return -1;
    else return *(S->top-1);
}//取栈顶元素
int main()
{
    char a[51],ch;
    int i,len,flag;
    Sqstack S;
    while(gets(a)!=NULL)
    {
        flag=1;//定义指示变量
    Initstack(&S);
    len=strlen(a);
    for(i=0;i<=len-1;i++)
    {
        if(a[i]=='('||a[i]=='['||a[i]=='{') Push(&S,a[i]);//如果是左半边的括号,则压入栈中,便于之后的比较
        else if(a[i]==')')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }//如果栈已为空,能不能匹配,指示变量置为0
            ch=Pop(&S);
            if(ch!='(')
            {
                flag=0;
                break;
            }//弹出栈顶指针,看括号是否匹配,若不匹配,则指示变量置为0
        }
        else if(a[i]==']')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }
            ch=Pop(&S);
            if(ch!='[')
            {
                flag=0;
                break;
            }
        }//同上
        else if(a[i]=='}')
        {
            if(Empty(&S)==-1)
            {
                flag=0;break;
            }
            ch=Pop(&S);
            if(ch!='{')
                {
                    flag=0;
                    break;
                }
        }//同上
    }
    if(GetTop(&S)!=-1) flag=0;//若右括号已经没有了,但是左括号还有,说明括号不匹配,指示变量置为0
    if(flag==1) printf("yes\n");
    else printf("no\n");
    }
    return 0;
}
 

你可能感兴趣的:(栈和队列)