HRBUST-1182 栈-----c++

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1182

题目描述:

给定一个从1开始的连续整数列1、2、3、4......n。

将上述数列按顺序入栈,中途栈顶元素可以出栈。

再给定一个出栈序列,判断此序列是否合法。

 

例如,将n设为4。即得到数列1、2、3、4。

再给定出栈序列1、3、4、2。

可以看出,此出栈序列合法。

过程如下,先将数列1、2、3、4中的元素1入栈,再将其出栈。

然后将元素2、3入栈,将元素3出栈。

最后将元素4入栈,再把栈内的仅余元素4、2出栈。

 

整个过程中,元素按照1、3、4、2的顺序出栈。证明其合法。

Input

输入包括多组测试用例。

对于每组测试用例,第一行包含一个整数n<100,代表从1开始的连续整数列长度。

第二行包含一个长度为n的数列,代表出栈序列。出栈序列的各元素在区间[1,n]内且不重复。

Output

若出栈序列合法,则输出Yes。

否则,输出No。

Sample Input

4

1 3 4 2

Sample Output

Yes

思路分析:

1.这里面用栈与队列解决这个问题,定义一个栈z与队列q解决这个问题。

2.首先需要把这个要判断的序列全部放入队列中,下面按照1-n的顺序,依次把这些数压栈。

3.每把一个数压栈后,这时候判断栈是否为空(不能判断队列)和栈顶元素是否和队头元素是否相等, 若这两个数相等,则栈顶与队头元素都出栈和队列。

4.等上一步都判断完,这时候判断一下队列或者栈元素是否为空即可(栈和队列选一个就可)

代码:

#include<iostream>
#include<stack>
#include<queue> 
using namespace std;
int main()
{
	int i,n,a[101];
	while(cin>>n)
	{
		stack<int> z;
		queue<int> q;//栈与队列定义要在while内部,想想为什么 
		for(i=1;i<=n;i++)
		{
			cin>>a[i];
			q.push(a[i]);
		}
		for(i=1;i<=n;i++)
		{
			z.push(i);
			while(z.empty()==0&&z.top()==q.front())
			{
				z.pop();
				q.pop();
			}
		}
		if(z.empty()==1)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
	return 0;
}

 

样例讲解:

1.假如要判断的的序列长度为4,序列值为1 3 2 4,首先把这个序列入队,这时候队列从头到尾的顺序为1 3 2 4

2.开始从1-n一 一判断,首先1入栈,这时候栈顶元素和队头元素想等,进行出队和出战操作,这时候栈空了,结束while循环,队头元素为3.

3.这时候把2入栈,不满足条件,不进行出栈和出队操作,继续把3入栈,这时候满足条件,进行出栈和出队操作,3出栈后,栈中还有2,继续进行判断,这时候有满足条件,继续出栈。

4.4进行入栈,这个情况和1一样。1-n判断完了,而且栈为空,所以这个序列满足条件。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值