字符串匹配问题(括号有序性)
作者:互联网
题目描述
字符串中只含有括号(),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该输出NO。输入格式
第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。输出格式
在输出文件中有n行,每行都是YES或NO。输入样例
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
输出样例
YES
YES
YES
YES
NO
#include<iostream> #include<cstring> using namespace std; char st[300], a[5]={'<','(','[','{'}; int top=0; int check(char x){ for(int i=0; i<4; i++){ if(x==a[i]) return i; } } void push(char x){ if(top<300) { st[++top]=x; return; } } void pop(){ if(top>0) top--; } char getTop(){ return st[top]; } void clear(){ top=0; return; } int main(){ int n; string s; bool flag; cin>>n; while(n--){ cin>>s; clear(); flag=true; // 假设不中途退出。 for(int i=0; i<s.length(); i++){ if(s[i]=='<'||s[i]=='('||s[i]=='['||s[i]=='{'){ // 入栈。 if(top==0){ push(s[i]); }else{ if(check(s[i])<=check(getTop())){ push(s[i]); }else{ cout<<"NO"<<endl; flag=false; // 中途退出 break; } } }else{ // 出栈。 if(s[i]=='>'&&getTop()=='<'){ pop(); } else if(s[i]==')'&&getTop()=='('){ pop(); }else if(s[i]==']'&&getTop()=='['){ pop(); }else if(s[i]=='}'&&getTop()=='{'){ pop(); }else{ cout<<"NO"<<endl; flag=false; // 中途退出 break; } } } // 循环结束: 判断栈元素是否完全出栈,(((((( 没有中途退出的情况。 if(flag){ if(top==0) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
标签:NO,int,top,括号,字符串,有序性,YES 来源: https://www.cnblogs.com/dks0313/p/16516123.html