您的位置:首页 > 其它

nyoj-2 括号配对【栈】

2015-07-28 15:38 155 查看
题目详见链接http://acm.nyist.net/JudgeOnline/problem.php?pid=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函数解题,利用栈的思想

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char a[10010];
int main()
{
	int N,len,i;
	scanf("%d",&N);
	while(N--)
	{
	//	gets(s);           //不能使用gets(s) 
		scanf("%s",a);
		len=strlen(a);
		stack<char>s;      //栈定义初始化 
		s.push(a[0]);      //第一个字符进栈 
		for(i=1;i<len;i++) 
		{
			if(s.size()==0)//先判断栈里面有没有数据,不然s.top()会出现错误 (第一次虽然有第一个字符进栈不会出现是空栈,但以后可能会因为 匹配成功 导致字符出栈 使栈为空 
			s.push(a[i]);
			else if(s.top()=='['&&a[i]==']')  //判断是否匹配 
			s.pop();                          //匹配成功 字符出栈 
			else if(s.top()=='('&&a[i]==')')
			s.pop();
			else 
			s.push(a[i]);
		}
		if(s.empty())         //判断是否为空栈  若为空  返回值为真 
		printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: