目录
首先
书接上回,我们现在将要开启学习stack,queue,priority_queue的旅途了。前面的知识我们先不回顾,没有看过SLT标准模板库(一),可以点开此链接——STL标准模板库(一)。
stack,queue,priority_queue都是容器适配器。
stack(容器适配器)
温馨提示:在此后的讲义里,我都会将stack,queue,priority_queue称为容器适配器。
容器适配器:是在顺序容器的基础上实现的,屏蔽了顺序容器的一部分功能,同时也突出或增强了另外的一部分功能。
容器适配器有以下三个成员函数:
- push:添加一个元素。
- top:返回顶部(对stack而言)或对头(对queue,priority_queue而言)的元素的引用。
- pop:删除一个元素。
注意:在我的SLT标准模板库(一)中讲过,容器适配器是没有迭代器的,因此STL中的各种排序、查找、变序等算法都不适用于容器适配器。
在这里我要讲一讲,此容器适配器跟栈有一定关系(有可能就是栈,作者有点没搞懂)。
栈:是一种后进先出(简写为:FILO或LIFO)的元素序列,访问和删除只能对栈顶的元素(即当前最后一个被加入栈的元素)进行,并且元素也只能被添加在栈顶。
有关的常用函数:
为了加深理解,请看如下图片:
stack的代码演示:
1.
#include<bits/stdc++.h>
using namespace std;
int main(){
stack<int> s;
s.push(10);//10这个元素从栈顶入栈
s.push(20);//20这个元素从栈顶入栈
s.push(30);//30这个元素从栈顶入栈
cout<<s.top()<<endl;//查看头部元素
s.pop();//弹出头部元素
cout<<s.top()<<endl;//查看头部元素
s.pop();//弹出头部元素
cout<<s.top();//查看头部元素
return 0;
}
输出:
30
20
10
栈的遍历输出相当于从大到小输出!!!
2.
#include<bits/stdc++.h>
using namespace std;
int main(){
stack<int> s;
int x;
while(1){//可无限输入
cin>>x;//输入
if(x==-1) break;
s.push(x);
}
while(s.empty()==false){//如果还有数没输完就继续弹出栈顶的数(在这里的false是bool中0的意思)
cout<<s.top()<<' ';
s.pop();//顺应while的执行条件
}
return 0;
}
输入:
1 2 3 4 5 -1
输出:
5 4 3 2 1
注意:在此重申一遍容器适配器是没有迭代器的,所以想要遍历,最好使用while()循环来遍历。
(可以自己打一个代码试试或者复制一下理解,玩一下呦!!!)
queue(队列)
解释:queue就是一个队列。是先进先出的,队头(first)的访问与删除操作只能在队头进行,添加操作只能在队尾进行。不能访问队伍中间的元素。
- queue可以用list和deque来实现,默认情况下用deque实现。
- 特点:先进先出(FIFO),队尾进,队头出。
常用函数:
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int> q;
int x;
while(1){
cin>>x;
if(x==-1) break;
q.push(x);
}
while(q.empty()==false){//如果还有数没输完就继续弹出头的数
cout<<q.front()<<endl;//输出队尾无意义(可以试试)
q.pop();//出队
}
return 0;
}
输入:
1 2 3 4 5 -1
输出:
1 2 3 4 5
priority_queue(优先队列)
解释:priority_queue是优先队列。他和普通队列(queue)的区别在于:优先队列的头部总是最大的——即执行pop操作时,删除的总是最大的元素;执行top操作时,返回的是最大元素的引用。
- priority_queue也是可以用list和deque实现的,默认情况下用deque实现。
- priority_queue默认的元素比较器是less<数据类型>。也就是说,在默认情况下,要放入priority_queue的元素是用"<"运算符比较的,而且priority_queue保证以下条件总是成立;对于队头的元素x和任意非队头的元素y,表达式"x<y"必定是false。
- 优先队列具有队列的所有特性,包括基本操作,只是在这个基础上添加了一个内部排序。
- priority_queue的第三个类型参数可以用来指定排序规则(前面的queue也是可以的,如:queue<int,vecotr<int>,less<int> > q 小顶堆(从大到小),priority_queue的定义同理)。
- priority_queue内部并非完全有序,但却能确保最大元素在队头(默认排序情况下)。
那么如何定义呢?
定义——priority_queue<数据类型,容器类型,比较方式>
特别注意:priority_queue特别适用于"不停地在一堆元素中取走最大元素"的这种情况。
小顶堆:从大到小(greater<数据类型>) 大顶堆:从小到大(less<数据类型>)
大顶堆:
#include<bits/stdc++.h>
using namespace std;
int main(){
priority_queue<int,vector<int>,less<int> > q;//less<int>从大到小(因为这是优先队列呀,当然你不写less<int>,他也是默认的大顶堆)
q.push(3);
q.push(5);
q.push(1);
q.push(4);
q.push(2);
while(q.size()!=0){
cout<<q.top()<<' ';//输出头部
q.pop();//出队
}
return 0;
}
输出:5 4 3 2 1
小顶堆:
#include<bits/stdc++.h>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> > q;//greater<int>从大到小(小顶堆)
q.push(3);
q.push(5);
q.push(1);
q.push(4);
q.push(2);
while(q.size()!=0){
cout<<q.top()<<' ';//输出头部
q.pop();//出队
}
return 0;
}
输出:1 2 3 4 5
作者最后的话(求了看看吧!!!)
这下子我们终于讲完了STL标准模板库,作者都快猝死了,太累了,还是那句话你们要自行在做一遍加深记忆呀,谢谢了,完结撒花!!!
最后,本篇文章是作者自己学习过后自行总结而成,可能会有些缺漏,我就在此,请看官们赐教!
最后的最后:
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!