括号配对问题
时间限制:
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>
#define N 10000+10
char s[N];
int main()
{
int n;
char c,*p;
scanf("%d\n",&n);
while(n--){
*s=getchar();
p=s+1;
while((c=getchar())!='\n'){
if(*(p-1)==c-1||*(p-1)==c-2)
p--;
else
*p++=c;
}
if(p==s)
printf("Yes\n");
else
printf("No\n");
}
}
堆栈实现:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char SElemType;
typedef char Status;
struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
};
//初始化堆栈空间
Status InitStack(SqStack *S)
{
S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S->base)
return ERROR;
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}
//入栈操作
Status Push(SqStack *S,SElemType e)
{
if(S->top-S->base>=S->stacksize)
{
S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(S->base==NULL)
return ERROR;
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}
//入栈操作
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base)
return ERROR;
*e=*(--S->top);
return OK;
}
//得到栈顶元素
Status GetTop(SqStack *S,SElemType *e)
{
if(S->top==S->base){
*e='\0'; //栈空取回 '\0'
return ERROR;
}
*e=*(S->top-1);
return OK;
}
Status StackEmpty(SqStack *S)
{
if(S->top==S->base)
return 0;
else
return 1;
}
int main()
{
SqStack S;
int n;
char a,b,c;
scanf("%d",&n); getchar();
if(InitStack(&S)){
while(n--)
{
while(1)
{
a=getchar(); //putchar(a);
if(a=='\n')
break;
GetTop(&S,&b);
if(a==b+1 || a==b+2){
Pop(&S,&c);
// printf("遇%c出栈操作 \n",a);
} else{
Push(&S,a);
// printf("遇%c入栈操作 \n",a);
}
}
if(!StackEmpty(&S)){printf("Yes\n");}
else {printf("No\n");}
S.top=S.base;
}
}
}