括号配对问题 栈的使用

来源:互联网 发布:快彩网彩票php源码 编辑:程序博客网 时间:2024/05/17 13:44

括号配对问题

时间限制:3000 ms  | 内存限制:65535 KB

难度:3

描述

现在,有一行括号序列,请你检查这行括号是否配对。

输入

第一行输入一个数N0<N<=100,表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符

输出

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

样例输入

3

[(])

(])

([[]()])

样例输出

No

No

Yes

来源

网络

上传者

naonao

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 10002

#define M 10010

#define overflow -1

#define true 1

typedef int statu;

typedef struct {

       chardate;

       char*base;

       char*top;

}stack1;

statu initialstack(stack1 &s){

       s.base=(char*)malloc(N*sizeof(char));

       if(!s.base)exit(overflow);

       s.top=s.base;

       returntrue;

}

void push(stack1 &s,char date){

       if(s.top-s.base>=N)

       {

              exit(-1);

       }

       *s.top++=date;

}

char pop(stack1 &s){

       if(s.base==s.top)

              exit(-1);

       chare;

       e=*--s.top;

       returne;

}

int empty(stack1 &s){

       if(s.base==s.top){return1;}

       elsereturn 0;

}

int match(char k[],stack1 &s){

       inti,l;

       l=strlen(k);

       for(i=0;i<l;i++)

       {

              if(k[i]==']'||k[i]=='['||k[i]==')'||k[i]=='(')

              {           

                     if(k[i]=='['||k[i]=='(')

                     {

                            push(s,k[i]);

                            continue;

                     }    

                     elseif(empty(s)&&k[i]==']'||empty(s)&&k[i]==')')                  

                            return0;               

                     if(!empty(s)&&k[i]==']')

                     {

                            if(pop(s)-k[i]!=-2)                      

                                   return0;                                                  

                     }

                     if(!empty(s)&&k[i]==')')

                     {

                            if(pop(s)-k[i]!=-1)                             

                                   return0;                                    

                     }    

              }/**/

              else

                     return0; 

       }

       if(empty(s)) 

              return1; 

       else

              return0;

}

int main(){

       chark[M];

       intn;

       stack1s;

       //scanf("%c",&e);

       //push(s,e);

       //pop(s);

       //printf("%c\n",e);

       scanf("%d",&n);

       getchar();

       while(n--)

       {

              scanf("%s",k);

              initialstack(s);

              if(match(k,s))printf("Yes\n");

              elseprintf("No\n");

              free(s.base);

       }

       return0;

}

原创粉丝点击