1. 程式人生 > >南陽理工:括號配對問題

南陽理工:括號配對問題

括號配對問題

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[","]","(",")"四種字元
輸出
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No
樣例輸入
3  [(])  (])  ([[]()])
樣例輸出
No  No  Yes

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define A 100
#define B 10
typedef struct
{
 char *base;
 char *top;
 int stacksize;
}sqstack;
int initstack(sqstack &s)
{
 s.base=(char *)malloc(A*sizeof(char));
 if(!s.base) exit(0);
 s.top=s.base;
 s.stacksize=A;
 return 0;
}
int push(sqstack &s,char e)
{
 if(s.top-s.base>=s.stacksize)
 {
  s.base=(char *)realloc(s.base,(s.stacksize+B)*sizeof(char));
  if(!s.base) exit(0);
  s.top=s.base+s.stacksize;
  s.stacksize+=B;
 }
 *s.top++=e;
 return 0;
}
int pop(sqstack &s,char &e)
{
 if(s.top==s.base) return 0;
 e=*--s.top;
 return 1;
}
int stackempty(sqstack &s)
{
 if(s.base==s.top) return 1;
 else return 0;
}
int gettop(sqstack &s,char &e)
{
 e=*(s.top-1);
 return 1;
}
int main()
{
 sqstack s;
 char ch,c,str[10000];
 int n,i,k,N;
 scanf("%d%c",&N,&c);
 while(N--)
 {
  initstack(s);//注意初始化棧的位置,不能放在最前面,否則上一組不匹配的結果會保留在棧中,對下一次匹配造成影響,形成錯誤的結果!!
  gets(str);
  n=strlen(str);
  for(i=0;i<n;i++)
  {
   ch=str[i];
   if(ch=='['||ch=='(')
    push(s,ch);
   else if(!stackempty(s))
   {
    gettop(s,c);
    if((ch==']'&&c=='[')||(c=='('&&ch==')'))
     pop(s,c);
    else
    { 
     printf("No\n");
     break;
    }
   }
   else
   {
    printf("No\n");
    break;
   }
  }
  if(i==n)
  {
   if(stackempty(s)) printf("Yes\n");
   else printf("No\n");
  }
 }
 return 0;
}


哈哈,上面的程式碼寫的太麻煩了,又寫了個簡單的!

#include<stdio.h>
#include<string.h>
char x[10002],y[10002];
int main()
{
   int i,N,len,j,flag;
   scanf("%d",&N);
   while(N--)
   {
        scanf("%s",x);
        len=strlen(x);
        for(i=0,j=0,flag=1;i<len;i++)
        {
            if(x[i]=='['||x[i]=='(') y[j++]=x[i];
           else if(j>0&&((x[i]==']'&&y[j-1]=='[')||(x[i]==')'&&y[j-1]=='('))) j--;
           else
           {
                   flag=0;
                  break;
            }  
           }
           if(flag==1&&j==0) printf("Yes\n");
           else printf("No\n");
   }
   //system("pause");
   return 0;
}