C++——stack和queue

作者:几冬雪来

时间:2023年10月5日

内容:C++------stack和queue内容讲解

目录

前言:

什么是stack和queue:

适配器模式:

stack:

queue:

deque:

相比vector和list:

对vector:

​编辑

对list:

使用deque:

结尾:


前言:

前几篇博客我们讲解了C++的list还有list的迭代器的实现,那么今天我们将进入新的知识板块------栈和队列(stack和queue)。

什么是stack和queue:

学习stack和queue之前我们要先对二者有个大致的了解。

那么什么是stack呢?stack在这里可以被我们称为容器适配器,适配器的作用就是将现有的东西进行转换

同样的queue也是一种容器的适配器

适配器本质上就是一种附用

并且作为容器适配器的stack和queue就不存在迭代器了,因为stack和queue要先进先出和后进先出的原因,不支持随意的遍历

适配器模式:

回顾完了stack和queue之后,既然在介绍的时候有说到它们被称为容器适配器,适配器就是对已有的东西进行适配装换

那么接下来就来讲解什么是适配器模式

stack:

在讲解栈的时候,我们曾经说过有两种书写栈的方法,一种是数组栈,另外一种则是链式栈

而在C语言时期,因为没有过硬的能力和技术的支撑,那个时候我们只是学习了数组栈的知识,但是今天我们将在这里学习一个新的方法,数组栈和链式栈的切换

因为学习过模板的原因,在转换的时候我们可以增加模板参数

在后来书写的时候,一个传的是vector,另一个传的是list。这样就可以完成数组栈和链式栈之间的一个交换

这里还有一种写法。

在模板参数这里,将后一个模板参数加上一个缺省参数。这样就会使得在下面代码书写的时候,在写模板时,如果只有一个模板参数,那么这里就默认传的是vector

相反如果是两个模板参数的话,那就是传的list

queue:

讲解完了栈之后,接下来我们来讲解队列的适配器。

因为stack和queue都是适配器,区别是一个先入先出,一个后入先出,因此在底层基础的构建上,栈和队列可以说是相同的

但是queue并不能和vector完全适配,vector接口处并没有提供头删

但是,不能完全适配并不是指在queue中就不能使用vector,二者是可以进行强制适配的

就如上图所写的代码,vector并不提供头删的接口。想要强制适配的话,这个地方就要提供二者都能使用的接口,也就是erase来进行头删操作

同样的在模板处也可以用list来作为缺省参数

deque:

接下来介绍的deque也是我们的容器。在官方的代码中deque就是他们所使用的默认容器,那么deque到底是什么?

首先deque在这个地方被称为------双端队列

双端队列顾名思义两个端都可以使用,通俗易懂来说deque就类似stack和queue的一种结合体

但是为什么这么好用和实用的容器我们现在才讲解它,那肯定是有原因的,因为对比stack和queue,deque有些地方存在问题我们才没有第一时间讲解它

就如上图一样,deque是stack和queue的结合体,因此它也同时拥有stack和queue的接口。但是deque却不能取代vector和list

deque确实拥有许多接口,但是在平时写代码的时候我们却是很少使用这个容器,这是因为deque的效率要低于vector和list

在C语言时期就讲解过数组栈(vector)和链式栈(list)的底层实现,一个是一整个数组,另外一个则是通过指针对数据进行串联

既然deque是二者的结合,那么它的底层又是什么样的?

这就是deque的底层,因为是vector和list的结合所以deque也有它们的特征所在

这个地方我们增加了一个中控指针数组来存储,在list中每个数据只是占据了一个空间的大小,在deque中每个指针指向的不是一个数据大小的空间,而是一个buff数组

如果中控指针数组(buff)满了的话,只需要对其进行扩容操作,而扩容的代价也是十分的小,只需要拷贝指针即可

同时要注意的是deque的头插操作,尾插的话照旧,头插就有些区别了。deque是从后往前插入数据

相比vector和list:

上面我们将deque的底层书写了出来,deque有它的优势所在,同时也会有存在缺陷的地方。那么与vector和list相对比,deque有什么优点和缺点

对vector:
对list:
使用deque:

在上面的比较结束后,我们可以看出来高频率的头插头删和尾插尾删很适合deque的使用

因此deque用来适配stack和queue的默认容器是十分合适的

但是高频的中间插入和高频的随机访问deque的使用不太行

同时deque在现实中使用十分的少,这是因为它的适配的东西不多,同时底层代码也是十分的复杂。直到目前deque使用能好于list和vector的地方就是stack和queue的默认容器

平时在正常书写代码的时候就使用vector和list。

结尾:

这篇博客可以说是我们C++学习的时候对C语言时期的stack和queue进行的一个拓展和延伸,同时也借由stack和queue介绍了一个新的容器deque,以及它的使用之处和对比vector和list的优劣,最后希望这篇博客能带来帮助。

相关推荐
A懿轩A37 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
机器视觉知识推荐、就业指导42 分钟前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香42 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻2 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
字节高级特工2 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc4 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel