括号匹配的检验
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:302 测试通过:197
总提交:302 测试通过:197
描述
采用栈实现,练习进栈入栈函数的编写.
输入
输入的第一行包含一个数,n
n表示要用例的个数
接下来是n行由括号构成的字符串,包含‘(’、‘)’、‘[’、‘]’。
输出
对每一测试用例,用一行输出结果,如果匹配,输出“YES”,否则输出“NO”
样例输入
2
[([][]())]
)[]()
[([][]())]
)[]()
样例输出
YES
NO
NO
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
typedef char SElemtype;
typedef struct SNode
{
SElemtype data;
struct SNode *next;
} SNode,*LinkStack;
LinkStack la;
int f;
void initstack(LinkStack &S)
{
S=NULL;
}
int stackEmpty(LinkStack &S)
{
if(S==NULL)
return 0;
else
return 1;
}
void push(LinkStack &S,char c)
{
LinkStack p;
p=new SNode;
p->data=c;
p->next=S;
S=p;
}
void Pop(LinkStack &S,char &e)
{
SNode *p;
e=S->data;
p=S;
S=S->next;
delete p;
}
int gettop(LinkStack s,char str)
{
if(s==NULL)
{
return 0;
}
else
{
if(s->data==str)
return 1;
else
return 0;
}
}
bool match(char a[])
{
la=new SNode;
int i,j,k;
char str;
initstack(la);
int kk=0;
int len=strlen(a);
for(i=0; i<len; i++)
{
if(a[i]=='('||a[i]=='[')
{
push(la,a[i]);
}
if(a[i]==')')
{
char c;
c='(';
if(stackEmpty(la)==1&&gettop(la,c)==1)
{
Pop(la,a[i]);
}
else
{
kk=1;
}
}
else if(a[i]==']')
{
char c;
c='[';
if(stackEmpty(la)==1&&gettop(la,c)==1)
{
Pop(la,a[i]);
}
else
{
kk=1;
}
}
}
if(stackEmpty(la)==0&&kk==0)
return 1;
else
return 0;
}
int main()
{
char a[100000];
int n;
scanf("%d",&n);
getchar();
while(n--)
{
f=0;
gets(a);
int t=match(a);
if(t==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}