jzoj匹配【栈】

> Description
给你一个由{a,b…z,A,B….Z}组成的字符串,我们把大写字母{A,B….,Z}当作括号,这26个字母形成13对括号,(A,Z),(B,Y)….(M,N),每对中的第一个字母表示左括号”(”,第二个字母表示右括号”)”。

一个匹配的表达式是指左括号和右括号要配对,也就是说所有的左括号的右边都有一个右括号和它配对,而且如果一个左括号在某一个配对的括号的中间,那么跟它配对的右括号也必须在该配对的括号中间。

例如AabcZBBefYeY是一个匹配的表达式。而AabcBZY不是,因为(B,Y)中在(A,Z)的中间,而Y不在。同样AabcZZA也不是,因为第二个Z没有配对的A。

小写字母{a,b,…z}不表示括号,可以出现在任何地方。你的任务是决定给定的字符串是否是匹配的。


>Input
输入包括多组测试数据,每组测试数据第一行是一个整数N,表示字母的个数,接下来第二行是N个字母。

>Output
对于每组测试数据,输出1或0,1表示匹配,0表示不匹配。


>Sample Input
12
AabcZBBefYeY

>Sample Output
1


>解题思路
运用栈思路,小写字母不用管它,遇到大写字母判断一下:如果为左括号就列入栈,为右括号就判断栈顶的是否为右括号匹配的左括号,如果是,就弹出这个左括号,如果不是,这个字符串就直接凉凉。

输入要注意一下:输入的是多组测试数据。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,c[1000000],t;
bool f;
string s;
int main()
{
	while((cin>>n>>s)) //输入数字n与字符串s
	{
		t=0; f=0;
		for(int i=0;i<n;i++)
		{
		  if(s[i]>='A'&&s[i]<='Z') //判断是否为大写字母
		  {
		     if(s[i]>='N') //如果为右括号
		     {
		   	  	    if(c[t]=='A'+'Z'-s[i]) t--; //匹配就弹出左括号
		   	  	    else
		   	  	    {
						 f=1; break; //否则直接输出1  	
					}
			 }
	         else c[++t]=s[i]; //左括号的话列入栈
		  }
		}
		if(t!=0||f) printf("0\n");
		else printf("1\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/86618425