描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该输出NO。
格式
输入格式
第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
输出格式
在输出文件中有n行,每行都是YES或NO。
样例
输入样例
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
<}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
输出样例
YES
YES
YES
YES
NO
限制
时间限制: 1000 ms
内存限制: 65536 KB
int main(){
map<char,int> mp;
int n,a[257]={0};
mp['{']=0,mp['[']=1,mp['(']=2,mp['<']=3;
mp['}']=4,mp[']']=5,mp[')']=6,mp['>']=7;
cin>>n;
while (n--){
string s;
stack<int> st;
cin>>s;
int len=s.size();
bool flag = true;
for (int i=0; i<len; i++)
a[i]=mp[s[i]]; //建立映射
for (int i=0; i<len; i++)
if (a[i]<=3){ //左括号
if (st.empty() || a[i]>=st.top()) st.push(a[i]); //入栈
else { flag=false; break; }
}
else {
if (!st.empty() && st.top()+4==a[i]) st.pop(); //出栈
else { flag=false; break; }
}
if (flag&&st.empty()) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}