括号的匹配
| Time Limit: 1000MS |
Memory Limit: 65535KB |
| Submissions: 428 |
Accepted: 68 |
Sample Input
5
{[(<>)]}
[()]
<>()[]{}
[{}]
{()}
Sample Output
解法一:用STL
# include<iostream>//用STL
# include<stdio.h>
# include<string.h>
# include<stack>
using namespace std;
char map[9] = {'<', '(', '[', '{', '>', ')', ']', '}'};
int main()
{
int nCase,len,flag,i,j,sign;
char str[500];
scanf("%d",&nCase);
while(nCase--)
{
stack<int> Num;
flag = 0;
scanf("%s",str);
len= strlen(str);
if(len%2==0)
{
for(i=0;i<len;i++)
{
for(j=0;j<8;j++)
{
if(str[i]==map[j])
{
if(!Num.empty())
{
sign= Num.top();
if(sign>=j) Num.push(j);//判断顺序问题
else if(j==sign+4) Num.pop();//判断是否匹配
else
{
flag=1;
break;
}
}
else Num.push(j);
}
}
if(flag) break;
}
if(!flag && Num.empty()) printf("YES\n");
else printf("NO\n");
}
else printf("NO\n");
}
return 0;
}
解法二:直接写
# include<stdio.h>
# include<string.h>
# include<malloc.h>
# define Len sizeof(struct node)
typedef int ElemType;
char map[8] = {'<', '(', '[', '{', '>', ')', ']', '}'};
typedef struct node
{
ElemType data[500],top;
}SeqStack;
void InitStack(SeqStack *s)
{
s->top=-1;
}
int EmptyStack(SeqStack *s)
{
return s->top==-1;
}
void push(SeqStack *s,ElemType e)
{
s->data[++s->top]=e;
}
void pop(SeqStack *s)
{
s->top--;
}
int main()
{
SeqStack *s;
int nCase,leap,i,j,len,sign;
char str[500];
scanf("%d",&nCase);
while(nCase--)
{
leap=0;
s=(SeqStack *)malloc(Len);
InitStack(s);
scanf("%s",str);
len=strlen(str);
for(i=0;i<len;i++)
{
for(j=0;j<8;j++)
{
if(str[i]==map[j])
{
if(!EmptyStack(s))
{
sign=s->data[s->top];
if(sign>=j)push(s,j);
else if(j==sign+4)pop(s);
else
{
leap=1;
break;
}
}
else
push(s,j);
}
}
if(leap)break;
}
if(!leap&&EmptyStack(s))printf("YES\n");
else printf("NO\n");
free(s);
}
return 0;
}