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