STL——stack与queue的介绍及模拟实现

server/2025/3/6 21:44:35/

目录

前言

stack与queue

容器适配器

deque的介绍

deque的底层

deque的接口

stack和queue的实现

 stack模拟实现

queue模拟实现

小结


前言

前面我们介绍了那个库里面的链表以及顺序表两个容器,通过这两个容器作为底层,我们可以去实现一些其他的数据结构,比如说今天我们要介绍的stack和queue,通过一个容器作为底层去封装实现另一个容器,这个过程在C++里面是适配器原理,这也是C++的一种设计模式。接下来的这篇文章,我们将着重介绍容器适配器以及stack和queen的模拟实现。

stack与queue

stack的定义:stack是一种容器适配器,只能从尾部插入和删除数据,可以支持以下操作:

1.empt():判空操作  

2.back():获取尾部元素操作

3.push():尾部元素插入操作

4.pop():尾部元素删除操作

我们查看C++标准库中对stack的定义:

queue的定义: queue是一种容器适配器,只能在尾部插入数据,头部删除数据。可以实现以下操作:

1.empt():判空操作  

2.back():获取尾部元素操作

3.front():获取头部元素

4.push():尾部元素插入操作

5.pop():头部元素删除操作

我们查看C++标准库中对queue的定义:

容器适配器

定义:适配器是一种设计模式,该模式就是将一个类的接口转换成客户希望的另一个接口。用通俗的话来讲就是一个类作为另一个类的迁移与转换。

举个例子,我们可以使用vector与list作为底层去实现stack的结构,具体怎么做呢?C++给我们提供的解决方案是通过传一个类模板,这个类模板的关键字是Container。可以参考下面代码,我们用vector来实现stack

template<class T,class Container=vector<T>>
class stack
{
public:void push(const T&x){_con.push_back(x);}void pop(){_con.pop_back();}bool empty(){return _con.empty();}size_t size()const{return _con.size();}const T& top(){return _con.back();}
private:Container _con;
};

对于queue而言,要实现头部删除,用vector作为底层头删效率过低,因此我们应该选择list作为底层,其代码如下所示:

template<class T,class Container=list<T>>
class queue
{
public:void push(const T& x){_con.push_back(x);}void pop(){return _con.pop_front();}const T& back(){return _con.back();}const T& front(){return _con.front();}size_t size()const{return _con.size();}bool empty(){return _con.empty();}
private:Container _con;
};

deque的介绍

可以看到,上述stack和queue的实现我们分别使用了vector和list作为底层,那么我们查看C++标准库中的实现会发现,C++标准库中并没有使用vector和list,而是采用了deque作为底层容器,如下图所示:

 deque的定义:deque的名称是双端队列,是一种双开口的连续空间的数据结构,双开口的含义是可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与victor比较,头插效率高,不需要搬移元素与list比较,空间利用率比较高。

deque的底层

我们查看deque的源代码,如下图所示:

分析上述代码,我们看到deque的底层封装了一个中控指针数组map,里面保存每一个数组的第一个元素的地址,有两个迭代器分别指向中控数组的开始和结束,还有一个记录中控数组当中值的个数,那么我们此时就要查看deque的迭代器,如下图所示:

对于deque的迭代器而言,里面封装了四个指针,cur指向当前位置,first指向数组的第一个位置,last指向数组的最后一个位置,node表示当前数组在中控数组的位置。

由此我们可以看到deque里面既有顺序结构又有链式结构,所以它实际上是vector和list的复合体,在头部和尾部插入删除效率高,但有个致命缺陷就是顺序遍历效率低下。因此它成为了最适合stack和queue的容器。

deque的接口

我们可以看到,deque既支持迭代器访问也支持 【】遍历是vector和list的复合体

stack和queue的实现

 stack模拟实现

template<class T,class Container= deque<T>>
class stack
{
public:stack(){}void push(const T&x){_con.push_back(x);}void pop(){_con.pop_back();}bool empty(){return _con.empty();}size_t size()const{return _con.size();}const T& top(){return _con.back();}
private:Container _con;
};

queue模拟实现

template<class T,class Container=deque<T>>
class queue
{
public:queue(){}void push(const T& x){_con.push_back(x);}void pop(){return _con.pop_front();}const T& back(){return _con.back();}const T& front(){return _con.front();}size_t size()const{return _con.size();}bool empty(){return _con.empty();}
private:Container _con;
};

小结

本篇文章我们介绍了stack和queue的模拟实现以及适配器原理,通过适配器我们可以用其他容器封装实现另一个容器,并提供统一接口访问,极大提高了代码的可读性和书写的便利性。

感谢您在百忙之中能够看完本篇文章,如果本篇文章对您有所帮助的话,希望您能留下点赞评论加关注,您的支持就是我创作的最大动力。


http://www.ppmy.cn/server/172980.html

相关文章

飞机大战lua迷你世界脚本

-- 迷你世界飞机大战 v1.2 -- 星空露珠工作室制作 -- 最后更新&#xff1a;2024年1月 ----------------------------- -- 迷你世界API适配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…

C/C++ | 每日一练 (5)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (5)题目参考答案引用引用和指针的区别…

3-7 WPS JS宏 工作表移动复制实例-2(多工作簿的多工作表合并)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…

STM32-智能小车项目

项目框图 ST-link接线 实物图&#xff1a; 正面&#xff1a; 反面&#xff1a; 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 测速模块 语音模块SU-03T 网站&#xff1a;智能公元/AI产品零代码平台 一、让小车动起来 新建文件夹智能小车项目 在里面…

【华为OD机考】华为OD笔试真题解析(20)--投篮大赛

题目描述 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成&#xff0c;过去几回合的得分可能会影响以后几回合的得分。 比赛开始时&#xff0c;记录是空白的&#xff0c;你会得到一个记录操作的字符串列表ops&#xff0c;其中ops[i]是你需要记录的第i项操…

1分钟从零开始搭建机器人管理系统(WindSurf)

1. 软件安装 可以直接安装作为IDE或者作为插件到其它IDE https://codeium.com/download 对话方式构建系统&#xff08;可以更换Claude 3.7、DeepSeek R1等模型&#xff09; 创建一个BS架构的机器人远程操控系统&#xff0c;具备机器人状态及位置实时更新&#xff0c;可以实…

前端实现word文档的生成和下载

一 前提 应项目需求&#xff0c;需要把前端生成word文档并下载。此项目我使用的是vue框架。本篇文章主要是记录自己在实现中遇到的问题以及最终使用方式。 二 实现方式 我的方式是将 html 转为word文档并下载。现在网上最常见的是使用 html-docx-js 配合 file-saver 使用…

flask 安装后不能识别

Windows 11 上&#xff0c;系统能够识别 Python 但无法识别 Flask, 使用python -m flask 方式可以 但是很麻烦 百度查询 认为 环境变量未配置 即使 Flask 已正确安装&#xff0c;如果其路径未添加到系统的环境变量中&#xff0c;系统也无法识别 flask 命令。可以通过以下步骤将…