ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

6.1 再谈栈和队列

2021-04-23 20:32:44  阅读:178  来源: 互联网

标签:遍历 出栈 队列 元素 t2 t1 int 谈栈 6.1


6.1 再谈栈和队列

从这章开始,我们就真正开始对算法的基础篇进行学习啦。在这章,我们会更加深入地了解数据结构,然后学习一些高级内容(的基础)。


6-1 并行程序模拟 (UVA 201)

题面请点击这里

惭愧地说,在python里面建立多线程,线程池我是会的,给线程上锁我也是会的,有什么效果实际的作用,我也是明白的。可是看了一天,也没有明白,这个问题到底要我做什么,看了别人博客发现都是CV的产物就不想看了。就在这里简单地介绍一下双端数列吧。(有看懂题面的欢迎来联系我)

双端数列:

首先是定义:

#include<iostream>
#include<deque> 
using namespace std;
int main(){
	deque<int>a;
	return 0;
}

我们这样建立的双端队列的元素也是连续的内存空间存储的,这一块stl的容器除了优先队列都是差不多的。

一些内置函数:

push_front(x)头部增加一个元素
push_back(x)尾部增加一个元素
insert(iterator,x)在迭代器指向的元素前添加元素
erase(iterator)删除迭代器指向的元素
erase(iterator1,iterator2)删除两个迭代器指向的元素之间的元素
pop_front()删除头部的元素
pop_back()删除尾部的元素
begin()指向头部元素的迭代器
back()指向尾部元素的迭代器
empty()判空
size()长度

双端队列和队列的主要区别就在于,它可以支持快速地在首尾两端进行插入和删除(队列只能在队尾,队首只能进行查询)。


6-2 铁轨 (UVA 514)

题面请点击这里

分析:这个题面看起来花里胡哨的,实际上就是有A序列中1-n的n个数据依次放入栈C中,而在放的过程中随时会弹出栈顶的元素放到另一个序列B。

也就是说我们需要将所有A中的元素放入栈C中,然后栈C中的所有元素需要弹出到B中。由于栈的pop和push的顺序不确定,所以B中包含1-n的这个序列的数据顺序也是不确定的。

现在给定你1-n的一个任意排列,需要你判断这个排列是否可以是A序列通过若干操作得到的B序列里的数据顺序。

例如:1 2 3 4 5 可行,5 4 1 2 3不可行。

首先还是输入一下数据:

stack<int>Cg;//表示中转站的C车库 
	int n,exp[1000];cin>>n;
	for (int i=1;i<=n;i++) cin>>exp[i];

这个没什么好说的。那我们怎么判断一个序列可不可以被得到呢?

我们以 4 3 5 2 1为例:

我们同时遍历A和B中地元素(这里的同时是一个条件制约的抽象的"同时",类似于我们上一题的进程),B中的第一个元素为4,A中的第一个元素为1,发现并不相等。

我们接着去找栈里的元素,发现栈里没有元素,直接跳过。

于是我们将1这个元素暂存于C栈中,考虑A的下一个元素。

B中的第一个元素为4,A中的第一个元素1。

这时B中的元素还停留在4,A中的元素遍历到了4,我们发现这两个元素相同了,于是我们进栈,出栈,即可在B中的第一个元素中得到4。此时我们栈中已经存放了三个元素1,2,3了。我们继续遍历A和B的下一个元素:

B遍历到3,A遍历到5,不相等,往栈里找,栈的首个元素为3,出栈。

B遍历到5,A遍历到5,相等,进栈,出栈。

B遍历到2,A已经没有元素,往栈里找,栈的首个元素为2,出栈。

B遍历到1,A已经没有元素,往栈里找,栈的首个元素为2,出栈。

B遍历结束,可行。

经过一次模拟,我们可以发现整个遍历的过程,主要分为三个部分,当前遍历到的A里的元素和B里的元素相不相等,如果相等进栈出栈各做一次,如果不相等,看栈里面有没有元素,如果有的话看看栈顶的元素和B遍历的元素相不相等,如果相等的话,直接出栈。如果这个再不相等,我们把A里的元素放一个进栈,去遍历A的下一个元素,如果此时A没有元素了,但是B还没有遍历完,并且栈顶的元素也不是B遍历到的元素,那么恭喜你扑街啦!

代码如下:

#include<iostream>
#include<stack> 
using namespace std;
int main(){
	stack<int>Cg;//表示中转站的C车库 
	int n,exp[1000];cin>>n;
	for (int i=1;i<=n;i++) cin>>exp[i];
	//t1表示A遍历到的位置,t2表示B遍历到的位置,flag为是否合法 
	int t1=1,t2=1,flag=1; string ans[2]={"No","Yes"};
	while (t2<=n){
		if (t1==exp[t2]){t1++;t2++;}//A和B遍历到的元素相同的情况 
		else if (!Cg.empty()&&Cg.top()==exp[t2]){Cg.pop();t2++;}//栈顶为B要的元素 
		else if (t1<=n){Cg.push(t1);t1++;}//A的元素进栈,遍历A的下一个元素 
		else {flag=0;break;} 
	}
	cout<<ans[flag]; return 0;
}

6-3 矩阵链乘 (UVA 442)

题面在这里

分析:这个题留给大家自己做练手吧,毕竟我已经在另一个专栏,写了一个有部分功能的矩阵类。至于算式里出现的括号,遇到字母时入栈,遇到右括号时出栈即可(括号无需入栈),这是一种比较常见的处理方式。

标签:遍历,出栈,队列,元素,t2,t1,int,谈栈,6.1
来源: https://blog.csdn.net/weixin_55835175/article/details/116054419

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有