题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
栈操作:
#include<iostream>
#include<cstring>
#include<stdlib.h>
#define max 10000 //注意本题的数组大小
#define overflow -1
using namespace std;
typedef struct {
int *base;
int *top;
int stacksize;
} sqstack;
void initstack(sqstack &s) { //栈的初始化
s.base=new int[max];
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=max;
}
int push(sqstack &s,char e) { //元素入栈
if(s.top-s.base==s.stacksize)return 0;
*s.top++=e; //top是s变量的成员指针,用*访问top指向的内容为e
}
int emptystack(sqstack &s) { //判断空栈
if(s.base==s.top)return 1;
return 0;
}
int gettopstack(sqstack &s) { //取栈顶元素
if(!emptystack(s))
return *(s.top-1); //top是s变量的成员指针,用*访问top指向的内容
}
void pop(sqstack &s,char &e) { //删除栈顶元素
if(s.base==s.top)return ;
e=*--s.top;
}
int main() {
int n;
sqstack s;
string ch;
cin>>n;
while(n--) {
int flag,i;
char e;
initstack(s);
flag=1;
cin>>ch;
for( i=0; flag!=0&&ch[i]!='\0'; i++) { //结束条件:字符串完毕,flag=0
switch(ch[i]) {
case'[':
case'(':
push(s,ch[i]);
break;
case']':
if(!emptystack(s)&&gettopstack(s)=='[')
pop(s,e);
else
flag=0;
break;
case')':
if(!emptystack(s)&&gettopstack(s)=='(')
pop(s,e);
else
flag=0;
break;
/*default:
break;*/
}
}
if(!flag||!emptystack(s)) cout<<"No"<<endl; //printf 会报错,C/C++尽量不要混用
else cout<<"Yes"<<endl;
}
}