13.stack容器和queue容器
前言:
stack是栈容器,queue是队列容器,这两个容器使用上都比较简单,且结构相似,就放到一起讲。
参考网站:https://legacy.cplusplus.com/
目录
前言:
一、stack容器介绍
stack接口:
构造函数:
二、queue容器介绍
queue接口:
构造函数:
三、deque的简单介绍
总结:
一、stack容器介绍
stack实现了栈的结构,特点是先进后出,只有一端接口。
stack是一种容器适配器,所谓容器适配器即对其他的容器进行封装,然后提供一组接口来间接控制其元素。
stack封装的底层容器默认是deque(双端队列),不过vector,list这些容器也是符合要求的,但至少要支持这些操作:
- empty
- size
- back
- push_back
- pop_back
stack接口:
和之前的vector、list这些比起来,stack提供的接口数量就很少了。
- empty判断容器是否为空
- size返回栈的数据个数
- top返回栈顶元素
- push负责入栈
- pop负责出栈
- swap用于交换数据
补充:
1. stack容器的pop接口没有返回值,所以如果需要反复取栈顶元素并出栈的话用不了pop的返回值,而只能先用top取栈顶元素,再pop出栈
2. 还重载了非成员函数swap,用于交换两个stack对象的值,用法:swap(stack1,stack2);
构造函数:
由于stack是容器适配器,所以不能直接用数据来进行初始化,而是需要传入一个容器对象,或者直接创建一个默认由deque实现的空对象。
不过stack支持用另一个容器的一段迭代器区间初始化。
实例代码:
deque<int> mydeque(3, 100); // 初始化3个数据的双端队列vector<int> myvector(2, 200); // 初始化2个数据的顺序表stack<int> first; // 创建一个空stack对象stack<int> second(mydeque); // 用双端队列初始化stack对象stack<int, vector<int> > third; // 指定使用vector作为适配器的底层容器stack<int, vector<int> > fourth(myvector);
二、queue容器介绍
queue实现了队列结构,特点是先进先出,有队头队尾两端接口。
queue也是一个容器适配器,默认底层容器是deque,底层容器至少需要满足这些操作:
- empty
- size
- front
- back
- push_back
- pop_front
queue接口:
queue的接口和stack极其相似:
- empty判断容器是否为空
- size返回队列的数据个数
- top返回队顶元素
- push负责队尾入队
- pop负责队头出队
- swap用于交换数据
queue的pop同样没有返回值,重载的非成员函数swap也同样可以交换queue对象。
构造函数:
构造方式也和stack类似:
deque<int> mydeque(3, 100); // 初始化3个数据的双端队列vector<int> myvector(2, 200); // 初始化2个数据的顺序表queue<int> first; // 创建一个空queue对象queue<int> second(mydeque); // 用双端队列初始化queue对象queue<int, vector<int> > third; // 指定使用vector作为适配器的底层容器queue<int, vector<int> > fourth(myvector);
三、deque的简单介绍
介绍stack和queue的时候都提到了deque,那也简单了解一下deque这个数据结构。
deque是双端队列,即可以头插头删,也可以尾插尾删,时间复杂度都是O(1),但不保证先进先出
deque的优势:
- 支持随机访问(数组的优势)
- 支持头插头删,且时间复杂度尾O(1)(链表的优势)
- 不需要扩容,想用随时申请(链表的优势)
- cpu告诉缓存命中率高
尽管deque结合了数组和链表的优势,但他还是不能取代替数组和链表,因为deque的几个优势都没有做到极致,更像是数组和链表结合的一个中和产物。
那我们来通过一张图看看deque是怎么实现的:
1. 所以deque其实就是申请多个数组,然后用链表的方式来管理这些数组
2. deque的迭代器比较复杂,由四个指针构成,_cur、_first、_last和_node,_cur表示当前具体的数据位置,_first表示buff数组的头,_last表示buff数组的尾,_node表示结点,即数组的位置
总结:
本文介绍了stack容器和queue容器的使用,还简单介绍了deque的结构。
如果觉得有帮助的话可以点赞收藏加关注支持一下!