现在的位置: 首页 > 综合 > 正文

字符串匹配问题

2018年04月29日 ⁄ 综合 ⁄ 共 1762字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.