前言:

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的结构。

如果觉得有帮助的话可以点赞收藏加关注支持一下!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐