nyoj2括号配对问题

点击打开链接

题目2 题目信息 运行结果 本题排行 讨论区

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
来源
网络

题目很典型,经典的栈的应用,去年已经水过,今天学弟问我,给他用数组讲了一遍,用stack讲了一遍,2种方法思路一样,但是stack却一直出现RuntimeError。研究了一个多小时,发现指针在中间会指错,没有考虑到中间会有栈空的情况,改过,AC!

#include<cstdio>
#include<cstring>
int main()
{
	int T,i,len,top;
	char a[11000],b[11000];
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",a);
		len=strlen(a);
		top=2;
		b[1]=a[0];
		for(i=1;i<len;i++)
		{
			if(a[i]=='('||a[i]=='[')
				b[top++]=a[i];
			if(a[i]==')')
			{
				if(b[top-1]=='(')
					top--;
				else
					b[top++]=a[i];
			}
			if(a[i]==']')
			{
				if(b[top-1]=='[')
					top--;
				else
					b[top++]=a[i];
			}
		}
		if(top==1)
			printf("Yes\n");
		else
			printf("No\n");
	}

}

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
stack< char >b;
int main()
{
	int T,i,len;
	char a[11000];	
	scanf("%d",&T);
	while(!b.empty())
			b.pop();
	while(T--)
	{
		scanf("%s",a);
		len=strlen(a);
		b.push(a[0]);
		for(i=1;i<len;i++)
		{
			if(b.empty())
				b.push(a[i]);
			else if(a[i]=='('||a[i]=='[')
				b.push(a[i]);
			else if(a[i]==')')
			{
				if(b.top()=='(')
					b.pop();
				else
					b.push(a[i]);
			}
			else if(a[i]==']'&&!b.empty())
			{
				if(b.top()=='[')
					b.pop();
				else
					b.push(a[i]);
			}	
		}
		if(!b.empty())
			printf("No\n");
		else
			printf("Yes\n");
		while(!b.empty())
			b.pop();

	//	b.clear();
	}
	return 0;
}


 

上一篇:UVAoj11991


下一篇:2014年多校联合赛第二场1011