在算术表达式中,除了加、减、乘、除等运算外,往往还有括号。
包括有大括号 {}
,中括号 []
,小括号 ()
,尖括号 <>
等。
对于每一对括号,必须先左边括号,然后右边括号;如果有多个括号,则每种类型的左括号和右括号的个数必须相等;对于多重括号的情形,按运算规则,从外到内的括号嵌套顺序为:大括号->中括号->小括号->尖括号,另外相同的括号可以嵌套。
例如,{[()]},{(())},{``{}}
为一个合法的表达式,而 ([{}]),{([])},[{<>}]
都是非法的。
输入格式
第一行包含整数 n,表示共有 n个表达式需要判断。
接下来 n 行,每行包含一个括号表达式。
输出格式
每行输出一个表达式的判断结果。
如果合法输出 YES
,否则输出 NO
。
数据范围
1≤n≤100
表达式长度不超过 100100。
输入样例:
5 {[(<>)]} [()] <>()[]{} [{}] {()}
输出样例:
解释
YES YES YES NO YES
cpp
#include <bits/stdc++.h>
using namespace std;
unordered_map<char, int> mp{{'{',1},{'[',2},{'(',3},{'<',4},{'}',5},{']',6},{')',7},{'>',8}};
char g[110];
int main()
{
int n;
cin >> n;
while(n --)
{
memset(g, 0, sizeof g);
cin >> g;
int len = strlen(g);
stack<char> stack;
for (int i = len - 1; i >= 0; i --)
{
if(stack.empty()) stack.push(g[i]);
else if(mp[stack.top()] > mp[g[i]] && mp[g[i]] > 4) break;
else if(mp[stack.top()] - mp[g[i]] == 4 ) stack.pop();
else stack.push(g[i]);
}
if(stack.empty()) puts("YES");
else puts("NO");
}
return 0;
}