您的位置:首页 > 其它

字符串匹配问题

2014-02-07 11:50 176 查看
【题目描述】

字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。

【输入格式】

文件的第一行为一个整数n(0<n<20),表示以下有多少个由括号组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。

【输出格式】

在输出文件中有N行,每行都是YES或NO。

【样例输入】

5

{}{}<><>()()[][]

{{}}{{}}<<>><<>>(())(())[[]][[]]

{{}}{{}}<<>><<>>(())(())[[]][[]]

{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

【样例输出】

YES

YES

YES

YES

NO

【分析】

此题比表达式括号匹配相比要复杂多了,一是增加了括号的种类,而是括号间有优先级别,所以此题不是所有的括号都直接入栈,是否入栈要看栈顶元素的优先级别是否高于当前,还有事不是有一个括回只要栈非空就可以出栈,这是还要判断栈顶元素是否是与当前括回向配对。

1.当前字符为括号时,如果栈为空直接入栈,如果非空,要比较栈顶元素与当前括号的优先级别,如果当前字符优先级别高于栈顶元素直接判定非法,否则入栈

2.当前字符为括回时,如果当前栈为空直接返回false,如果栈非空,如果栈顶元素是与挡在括回匹配的括号则栈顶元素出栈,否则返回false

3.如果遍历完栈为空则为匹配,如果非空为不匹配

此题有个技巧是要为当前的括号设定优先级别,比如'<'为1,'('为2,‘['为3,’{‘为4,括回不需要设置优先级

c++代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int n;
string s[30];
void init();
bool my_judge(string);
int my_pre(char);
int main()
{
init();
return 0;
}
void init()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>s[i];
if(my_judge(s[i]))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
bool my_judge(string s)
{
stack<int> a;
int k;
for(int i=0;i<s.size();++i)
{
k=my_pre(s[i]);	//取得当前字符的优先级
if(k<5)//当当前字符为括号时
{
if(a.empty())//如果栈为空直接入栈
{
a.push(k);
continue;
}
else//栈非空
{
if(k>a.top())return false;//如果当前字符优先级别高于栈顶,false
else//如果当前字符优先级别低于或等于栈顶,则入栈
{
a.push(k);
continue;
}
}
}
if(k==5)//当前字符为括回时
{

if(a.empty()) return false;//如果栈空,false
if(s[i]=='>')//下面逐一判断如果和栈顶元素匹配则出栈,否则返回false
{
if(a.top()==1)a.pop();
else return false;
}
if(s[i]==')')
{
if(a.top()==2)a.pop();
else return false;
}
if(s[i]==']')
{
if(a.top()==3)a.pop();
else return false;
}
if(s[i]=='}')
{
if(a.top()==4)a.pop();
else return false;
}

}
}
if(a.empty())return true;//最后如果栈空则匹配,否则不匹配
else return false;
}
int my_pre(char ch)
{
if(ch=='<')return 1;
if(ch=='(')return 2;
if(ch=='[')return 3;
if(ch=='{')return 4;
return 5;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: