题目描述:
现在,有一行括号序列,请你检查这行括号是否配对。
输入描述:
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", “]”, “(”, “)” 四种字符
输出描述:
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入:
复制
3
[(])
(])
([])
样例输出:
No
No
Yes
问题解决的一个关键突破口在于每一个右括号是和它最近的左括号配对的,知道这个原理,我们就有思路了。我们这里利用栈来解决这个问题,遇到左括号进栈,遇到右括号和栈顶元素进行比较,如果相同则栈顶元素出栈,如果最后栈为空则配对,否则不配对。记得右括号的ASCII码要比左括号大1或者大2,字符串和栈的空间也记得开大一点,不然OJ过不了。
#include<iostream>
using namespace std;
#define MAXSIZE 10000
#define OVERFLOW -2
typedef struct stack
{
char *top;
char *base;
int stacksize;
}Stack;
bool init(Stack &S);
bool push(Stack &S,char c);
bool isempty(Stack &S);
bool gettop(Stack &S,char &c);
bool pop(Stack &S);
bool match(char a,char b);
int judege2(char data[]);
int main()
{
int n;
cin>>n;
int x=n;
char data[10000];
while(n--)
{
cin>>data;
judege2(data);
}
return 0;
}
bool init(Stack &S)
{
S.base = new char[MAXSIZE];
if(!S.base)
exit(OVERFLOW );
S.top=S.base;
S.stacksize=MAXSIZE;
return true;
}
bool push(Stack &S,char c)
{
if(S.top-S.base==S.stacksize)
return false;
*S.top++=c;
return true;
}
bool isempty(Stack &S)
{
if(S.top==S.base)
return true;
else
return false;
}
bool pop(Stack &S,char &x)
{
if(S.base==S.top)
return false;
x=*--S.top;
return true;
}
bool gettop(Stack &S,char &c)
{
if(isempty(S))
{
return false;
}
else
{ c=*(S.top-1);
return true;
}
}
bool match(char a,char b)
{
if(a+1==b||a+2==b)
return true;
else
return false;
}
int judege2(char data[])
{
Stack S;
char z;
init(S);
for(int i=0;data[i]!='\0';i++)
{
switch(data[i])
{
case'(':
case'[':
push(S,data[i]);
break;
case')':
case']':
if(isempty(S))
{
cout<<"No"<<endl;
return 0;
}
else
{
gettop(S,z);
if(match(z,data[i]))
pop(S,z);
else
{
cout<<"No"<<endl;
return 0;
}
}
}
}
if(isempty(S))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}