题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
这道题原理挺简单,就是入栈,出栈匹配字符即可。需注意的是以下2个方面:
1、括号顺序不对,不匹配问题
2、左括号比右括号多、右括号比左括号多,不匹配问题
但却困扰了我好久,一直出现咒语念错50%,找了网上好多代码贴上去依旧50%,后来放到南阳OJ中显示编译错误,是gets()输入字符串的错误,后来改为scanf输入AC,又返回Codeup重新献花,终于升仙。下面是我的解题代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define MAX 10010
typedef struct
{
char *stack;
int top;
}STACK,*LPSTACK;
void create(LPSTACK s)
{
s->stack=(char *)malloc(sizeof(char)*MAX);
s->top=-1;
}
int IsEmpty(LPSTACK s)
{
if(s->top==-1)
{
return 1;
}
return 0;
}
void push(LPSTACK s,char x)
{
if(s->top==MAX - 1)
{
return ;
}
s->stack[++s->top]=x;
}
void pop(LPSTACK s)
{
if(IsEmpty(s))
{
return ;
}
s->stack[s->top--];
}
int getTop(LPSTACK s)
{
if(IsEmpty(s))
{
return -1;
}
return s->stack[s->top];
}
int check(char ch[],int n)
{
LPSTACK s = (LPSTACK)malloc(sizeof(STACK));
create(s);
int i;char c;
for(i=0;i<n;i++)
{
switch(ch[i])
{
case '(':push(s,ch[i]);break;
case '[':push(s,ch[i]);break;
case ')':c=getTop(s);
if(c=='(')
{pop(s);continue;}
else{return 0;};
break;
case ']':c=getTop(s);
if(c=='[')
{pop(s);continue;}
else{return 0;};
break;
}
}
if(s->top==-1&&i==n)
{
return 1;
}
return 0;
}
int main()
{
char ch[MAX];
int l,N;
scanf("%d",&N);
getchar();
if(N>0&&N<=100)
{
while(N--)
{
scanf("%s",ch);
l=strlen(ch);
if(check(ch,l))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}