数据结构,问题 G: 字符串匹配问题
题目描述
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出: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;
}