题目描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。
输入
文件的第一行为一个整数n(0<n<20),表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。
输出
在输出文件中有N行,每行都是YES或NO。
样例输入 复制
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
样例输出 复制
YES
YES
YES
YES
NO
题解
在做括号匹配一类题目需要注意的点:
- 在读到右括号选择出栈前要判断栈是否为空
- 在拿出栈顶做某些判断前判断栈是否为空
- 在多类右括号问题中,在读取右括号出栈时需要判断栈顶左括号是否匹配
- 清空st栈 :
stack<char> ().swap(st);
代码
题解
#include<bits/stdc++.h>
using namespace std;stack<char> st;int main(){int t;cin >> t;map<char, int>mp;mp['<'] = 1;mp['('] = 2;mp['['] = 3;mp['{'] = 4;map<char, char> mmp;mmp['<'] = '>';mmp['('] = ')';mmp['['] = ']';mmp['{'] = '}';while(t --){string s;cin >> s;bool flag = false;for(char c : s){if(c =='(' || c == '[' || c =='<' || c =='{'){if(st.empty()){st.push(c);}else {char p = st.top();if(mp[p] < mp[c]){flag = 1;break;}else{st.push(c);}}}else{if(st.empty()){flag = 1;break;}else{char p = st.top();if(mmp[p] != c){flag = 1;break;}else st.pop();}}}if(!st.empty() || flag)cout << "NO" << '\n';else cout << "YES" << '\n';stack<char> ().swap(st); }return 0;
}