一、信息学oj-1355:字符串匹配问题(strs)
(1)题目描述
字符串中只含有括号 (),[],<>,{}
,判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{}
,例如。输入: [()]
输出:YES
,而输入([]),([)]
都应该输出NO
。
【输入】
第一行为一个整数nn,表示以下有多少个由括好组成的字符串。接下来的nn行,每行都是一个由括号组成的长度不超过255255的字符串。
【输出】
在输出文件中有nn行,每行都是YES
或NO
。
【输入样例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【输出样例】
YES
YES
YES
YES
NO
(2)题目分析
这道题的思路很简单,跟括号匹配问题一样,只是在括号匹配问题上增加了另外两个括号,只需要按照先后级入栈出栈即可,如果先后级不相匹配则报错,比如,<},(},这些就要用多条语句讨论,这里注意,由于输出的不是一组字符串,所以每次需要栈清空字符串清空。
(3)代码实现
#include<bits/stdc++.h>
using namespace std;
stack<char>q;
int main()
{
int n;
cin>>n;
while(n--){
bool flag=true;
string s;
s.clear();
cin>>s;
while(!q.empty()){
q.pop();
}
for(int i=0;s[i];i++){
if(s[i]=='<'){
q.push(s[i]);
}
else if(s[i]=='('){
if(!q.empty()){
if(q.top()=='<')
flag=false;
else q.push(s[i]);
}
else q.push(s[i]);
}
else if(s[i]=='['){
if(!q.empty()){
if(q.top()=='('||q.top()=='<'){
flag=false;
}
else q.push(s[i]);
}
else q.push(s[i]);
}
else if(s[i]=='{'){
if(!q.empty()){
if(q.top()=='['||q.top()=='('||q.top()=='<'){
flag=false;
}
else q.push(s[i]);
}
else q.push(s[i]);
}
else if(s[i]=='>'){
if(q.empty()){
flag=false;
}
else{
if(q.top()=='<') q.pop();
else flag=false;
}
}
else if(s[i]==')'){
if(q.empty()) flag=false;
else{
if(q.top()=='(') q.pop();
else flag=false;
}
}
else if(s[i]==']'){
if(q.empty()) flag=false;
else{
if(q.top()=='[') q.pop();
else flag=false;
}
}
else if(s[i]=='}'){
if(q.empty()) flag=false;
else{
if(q.top()=='{') q.pop();
else flag=false;
}
}
}
if(q.empty()&&flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}