【栈】【字符】匹配(jzoj 1612)

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86613986

匹配

题目大意:

给你一个长度为n的字符串(有多组数据),中间有小写字母(没用的东西)和大写字母,A-M是左括号,与之相对的是右括号Z-N(之所以说是Z-N而不是N-Z是因为只有Z可以和A相对,只有M可以和N相对……),求他是否正确,就是判断是否有单个括号,括号不匹配,左括号过多,右括号过多的情况,正确输出1否则输出0

样例输入

12

AabcZBBefYeY

样例输出

1

数据范围限制

提示

数据说明:

50%的数据N<=1000

100%的数据N<=1000000

解题思路

利用栈的原理,当有大写字母时就判断,如果和栈顶匹配,dep(栈的高度)++,否则就入栈,最后看看栈是否为空就行了

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int dep,n,a[1000005];
char x;
int main()
{
	while(cin>>n)
	{
		dep=0;
		for (int i=1;i<=n;i++)
		  {
		  	cin>>x;
		  	if((x>='A')&&(x<='Z'))//判断是否为大写字母
		  	{
		  		if ((dep)&&(x==a[dep])) dep--;//判断是否可以和栈顶配对
		  		else a[++dep]=155-x;//入栈
			}
		  }
		if (!dep) printf("1\n");//输出
		else printf("0\n");//输出
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86613986