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