【题目描述】
字符串中只含有括号 (),[],<>,{}
,判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{}
,例如。输入: [()]
输出:YES
,而输入([]),([)]
都应该输出NO
。
【输入】
第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255255的字符串。
【输出】
在输出文件中有n行,每行都是YES
或NO
。
【输入样例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【输出样例】
YES
YES
YES
YES
NO
cpp
#include<bits/stdc++.h>
using namespace std;
int ab(char c)
{
if(c=='<') return 1;
if(c=='(') return 2;
if(c=='[') return 3;
if(c=='{') return 4;
if(c=='>') return -1;
if(c==')') return -2;
if(c==']') return -3;
if(c=='}') return -4;
}
int main()
{
int n;
bool f;
string s;
cin>>n;
for(int j=1; j<=n; j++)
{
f=0;
cin>>s;
stack<int >a;
for(int i=0; i<s.size(); i++)
{
int k=ab(s[i]);
if(k>=1)
{
if(a.empty())
{
a.push(k);
}
else if(k<=a.top())
{
a.push(k);
}
else
{
f=1;
cout<<"NO"<<endl;
break;
}
}
else
{
if(a.empty())
{
f=1;
cout<<"NO"<<endl;
break;
}
else if(a.top()+k==0)
{
a.pop();
}
else
{
f=1;
cout<<"NO"<<endl;
break;
}
}
}
if(f==0)
{
if(a.empty())
{
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
}
return 0;
}