时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0< N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“, “]”, “(“, “)” 四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([])
样例输出
No
No
Yes
来源
网络
上传者
naonao
#include <stdio.h>
#include <string.h>
#define maxsize 10000
typedef struct {
char Data[maxsize];
int top;
}STACK;
void init(STACK *s) {
s->top = -1;
}
//进栈
void Push(STACK *s, char data) {
if (s->top < maxsize) {
s->top++;
s->Data[s->top] = data;
}
}
//出栈
void Pop(STACK *s) {
if (s->top > -1) {
s->top--;
}
}
int main() {
STACK stack;
int N;
int polymerous; //多出的) ]括号
int len = 0;
char str[10000];
scanf("%d", &N);
while(N--) {
polymerous = 0;
init(&stack);//初始化栈
scanf("%s", str);
len = strlen(str); //字符串长度
if (len & 1) { //通过与运算判断奇偶,奇数直接错 ,不可能是配对的
printf("No\n");
continue;
}
for (int i = 0; i < len; i++) {
if (str[i] == '(' || str[i] == '[') {
Push(&stack, str[i]); //将( [ 入栈
}
else {
if ((str[i] == ')'&&stack.Data[stack.top] == '(' )|| (str[i] == ']'&&stack.Data[stack.top] == '[')) {
Pop(&stack); //括号匹配出栈
}
else {
polymerous=1; //判断,当有右括号不能与栈顶元素匹配时,说明这串括号已经不能完整的匹配成功了!
break;
}
}
}
if (stack.top == -1&&polymerous==0)
printf("Yes\n");
else {
printf("No\n");
}
}
//system("pause");
return 0;
}