题目链接
这道题借用c++里面的栈的模板,写的比较繁琐
#include<iostream>
#include<cstring>
#include<stack>
char str[10000];
using namespace std;
bool isok(char *str,int len)
{
int i;
stack<char> stack;
for(i=0;i<len;i++)
{
if(str[i]=='['||str[i]=='{'||str[i]=='<'||str[i]=='(')
stack.push(str[i]);//入栈
if(str[i]==']'||str[i]=='}'||str[i]=='>'||str[i]==')')
{
if(stack.empty())
{//栈空表明出现错误
return false;
}
switch(str[i])
{//检测配对 若'['是栈顶元素则说明匹配,并删除栈顶元素;反之应当返回false('{''(''<'同理)
case']':
{
if('['!=stack.top()) return false;
stack.pop();
break;
}
case')':
{
if('('!=stack.top()) return false;
stack.pop();
break;
}
case'}':
{
if('{'!=stack.top()) return false;
stack.pop();
break;
}
case'>':
{
if('<'!=stack.top()) return false;
stack.pop();
break;
}
}
}
}
if(stack.empty()) return true;//最后栈空表明所有括号都成功配对
else
{
stack.pop();
return false;
}
}
int main()
{
int N,len;
cin>>N;
while(N--)
{
cin>>str;
len=strlen(str);
if(isok(str,len)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}