南陽理工:括號配對問題
括號配對問題
時間限制: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;
}