标准栈之括号匹配

来源:互联网 发布:c语言中char的范围 编辑:程序博客网 时间:2024/04/29 02:44

题目描述

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

输入

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

输出

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

示例输入

sin(20+10)
{[}]

示例输出

yes

no

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define sizenum 100
#define maxsize 100
typedef char element;
typedef struct
{
    element *top;
    element *base;
    int stsize;

}sq;
int intistack(sq*l)
{
   l->base=(element*)malloc(maxsize*sizeof(element));
   if(!l->base)
    return -1;
   l->top=l->base;
   l->stsize=maxsize;
   return 0;
}
int empty(sq*l)
{
   if(l->base==l->top)
    return 1;
   else return 0;
}
int push(sq*l,char *a)
{
    if(l->top-l->base>l->stsize)
    {
       l->base=(element*)realloc(l->base,(l->stsize+sizenum)*sizeof(element));
       if(!l->base)
        return -1;
        l->top=l->base+l->stsize;
        l->stsize+=sizenum;
    }
    *(++l->top)=*a;
    return 0;
}
void chuli(sq*l,char s[])
{
    int i,len=strlen(s),flag=0;
    for(i=0;i<=len-1;i++)
    {
       if(s[i]=='('||s[i]=='['||s[i]=='{')
            {push(l,&s[i]);
            flag=1;}
       else
       {
          if(empty(l)&&(s[i]==']'||s[i]=='}'||s[i]==')'))
          {  push(l,&s[i]);
             flag=1;
             break;
          }
          if(!empty(l)&&(s[i]=='}'||s[i]==']'||s[i]==')'))
          {
              if((*(l->top)=='('&&s[i]==')')||(*(l->top)=='['&&s[i]==']')||(*(l->top)=='{'&&s[i]=='}'))
               {  flag=1;
                  l->top--;
               }
               else {
                    flag=1;
                    push(l,&s[i]);}
          }
       }
    }
     if(empty(l)&&flag==1)
        printf("yes\n");
     else printf("no\n");

}
int main()
{
    char s[maxsize];
    sq l;
    while(gets(s)!=NULL)
    {
        intistack(&l);
        chuli(&l,s);

    }

    return 0;
}

 

 

 

 

 

 

0 0