括号配对问题
时间限制: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");elseprintf("No\n");}
}
堆栈实现:
#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10typedef 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;elsereturn 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;} }}