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