【c++丨STL】stack和queue的使用及模拟实现

🌟🌟作者主页:ephemerals__
🌟🌟所属专栏:C++、STL

目录

前言

一、什么是容器适配器

二、stack的使用及模拟实现

1. stack的使用

empty

size

top

push和pop

swap

2. stack的模拟实现

三、queue的使用及模拟实现

1. queue的使用

empty

size

front和back

push和pop

swap

2. queue的模拟实现

总结


前言

        本篇文章,博主将介绍STL中两个比较重要的容器适配器stack(栈)queue(队列)以及它们的使用方法,并且尝试模拟实现它们。如果你不是很了解栈和队列这两种数据结构,可以参阅这篇文章:

【数据结构】栈和队列(c语言实现)(附源码)_创建栈和队列及使用代码-CSDN博客

正文开始

一、什么是容器适配器

        与vector、list这些容器不同,stack和queue被称作容器适配器。所谓容器适配器,就是指在一种已有的容器基础上,为其添加了一些新的特性或者功能,目的是使一事物的行为类似于另一类事物。

        比如说栈这一数据结构,它的本质其实就是对顺序表或者链表的功能进行了一些限制,例如无法遍历、只能在一端进出数据等,但其底层仍然是顺序结构或是链式结构。STL在设计stackqueue时,并没有从零开始构建它们的底层结构,而是采用了这种设计思想,对现有容器进行了封装,从而实现了它们。

        接下来,我们看看SGI版本的STL源码是怎么实现stack的:

可以看到,源码使用了一个叫做deque的容器创建对象,然后调用该对象的一些接口来实现stack的接口。之后模拟实现stack和queue的过程中,我们也将遵循源码的设计思路,对其他容器(例如vector和list)进行封装。

关于deque(双端队列)的底层结构,博主将在后续文章中讲解。

二、stack的使用及模拟实现

        接下来,我们正式开始学习stack的使用方法,并尝试模拟实现。

1. stack的使用

        stack的成员函数如下:

注意:容器适配器是不支持遍历的,所以它们没有迭代器接口。 

empty

empty的作用是判断栈是否为空,若为空则返回true,否则返回false。 

代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{stack<int> s1;stack<int> s2;s2.push(1);//压入一个元素cout << s1.empty() << endl;cout << s2.empty() << endl;return 0;
}

size

size用于获取栈中元素个数

代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{stack<int> s;s.push(1);s.push(1);s.push(1);cout << s.size() << endl;return 0;
}

top

top用于获取栈顶元素。 代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{stack<int> s;s.push(10);cout << s.top() << endl;return 0;
}

push和pop

push的功能是将数据压入栈顶,而pop可以将栈顶元素弹出

使用举例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{stack<int> s;for (int i = 1; i <= 10; i++)//循环压入十个元素{s.push(i);}while (!s.empty())//栈非空则循环出栈{cout << s.top() << ' ';s.pop();//出栈}return 0;
}

swap

swap用于交换两个栈的内容。 

2. stack的模拟实现

        stack的模拟实现也比较简单,由于我们之前使用顺序结构来实现栈,那么我们就将vector作为封装容器。代码如下:

#include <iostream>
#include <vector>
using namespace std;template<class T, class Container = vector<T>>//模板参数默认为vector
class Stack
{
public://压栈void push(const T& x){_con.push_back(x);//调用vector的尾插}//出栈void pop(){_con.pop_back();//调用vector的尾删}//取栈顶元素const T& top() const{return _con.back();//调用vector的获取尾元素}//判空bool empty() const{return _con.empty();//调用vector的empty}//获取元素个数size_t size() const{return _con.size();//调用vector的size}//交换void swap(Stack<T>& s){_con.swap(s._con);//调用vector的交换函数}
private:Container _con;//成员容器
};

三、queue的使用及模拟实现

        在掌握了stack的使用与模拟实现之后,我们为大家介绍queue的使用及模拟实现。

1. queue的使用

        queue的成员函数如下:

empty

empty用于判断队列是否为空。若为空则返回true,否则返回flase。

代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{queue<int> q1;queue<int> q2;q1.push(1);cout << q1.empty() << endl;cout << q2.empty() << endl;return 0;
}

size

size用于获取队列中的元素个数。代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{queue<int> q;q.push(1);q.push(1);q.push(1);q.push(1);q.push(1);cout << q.size() << endl;return 0;
}

front和back

frontback分别用于获取对头/队尾元素。代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);cout << q.front() << endl;cout << q.back() << endl;return 0;
}

push和pop

pushpop分别用于进行入队/出队操作注意对头出队,队尾入队

代码示例:

#include <iostream>
#include <stack>
#include <queue>
using namespace std;int main()
{queue<int> q;for (int i = 1; i <= 10; i++){q.push(i);}while (!q.empty()){cout << q.front() << ' ';q.pop();}return 0;
}

swap

swap用于交换两个队列的内容

2. queue的模拟实现

        接下来,我们尝试模拟实现queue。由于list具有头删和尾插的接口,我们就将list作为封装容器。代码实现如下:

#include <iostream>
#include <list>
using namespace std;template<class T, class Container = list<T>>//模板参数默认为list
class Queue
{
public://入队void push(const T& x){_con.push_back(x);//调用list的尾插}//出队void pop(){_con.pop_front();//调用list的头删}//取队头元素const T& front(){return _con.front();//调用list的front}//取队尾元素const T& back(){return _con.back();//调用list的back}//获取元素个数size_t size(){return _con.size();//调用list的size}//判空bool empty(){return _con.empty();//调用list的empty}//交换void swap(Queue<T>& q){_con.swap(q._con);//交换两个成员容器的内容}
private:Container _con;//成员容器
};

总结

        今天我们学习了STL两个适配器:stack和queue的使用及模拟实现。不难发现,容器适配器的实现思路显著提高了正确率和代码复用率。 如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE初学07

JavaEE初学07 MybatisORMMybatis一对一结果映射一对多结果映射 Mybatis动态sqlif标签trim标签where标签set标签foreach标签补充 在这里插入图片描述右击运行即可 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c71d44d027374a399d5d537ce96f00e1.png) Mybatis Myba…

《Spring Cloud 微服务架构探秘》

一、Spring Cloud 微服务架构概述 Spring Cloud 是基于 Spring Boot 构建的微服务开发框架&#xff0c;它充分利用了 Spring Boot 的便利性&#xff0c;极大地简化了分布式系统基础设施的开发。 Spring Cloud 具有诸多显著特点。首先&#xff0c;它提供了丰富的组件&#xff0…

【AIGC】破解ChatGPT!如何使用高价值提示词Prompt提升响应质量

文章目录 为什么高价值提示词如此重要&#xff1f;&#x1f50d;1.1 提升响应的相关性和准确性1.2 节省时间与资源1.3 增强用户体验 了解ChatGPT的工作原理&#x1f9e0;2.1 语言模型的训练过程2.2 上下文理解与生成2.3 限制与挑战 高价值提示词的核心要素✍️3.1 清晰明确的指…

D74【 python 接口自动化学习】- python 基础之HTTP

day74 http基础定义 学习日期&#xff1a;20241120 学习目标&#xff1a;http定义及实战 -- http基础介绍 学习笔记&#xff1a; HTTP定义 HTTP 是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于 TCP/IP 通信协议来传递数据&…

2025 -生物信息学- GEO - 神经网络分析-ANN

GEO - 神经网络分析-ANN 01. 准备文件 id GSM3587381_con GSM3587382_con GSM3587383_con GSM3587384_con GSM3587385_con GSM3587386_con GSM3587387_con GSM3587388_con GSM3587389_con GSM3587390_con GSM3587391_con GSM3587392_con GSM3587393_con GSM3587394_con GSM358…

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…

5G Non-Public Network(三)Public Network Integrated NPN

这篇我们来看下PNI-NPN,之前都没有提到NPN引入的背景,这里就简单看下。 NPN引入的背景如上,就不细说了,贴在这里,确实很简单的看了下。紧接着就来看下规范上的内容。 相比于SNPN,PNI-NPN是PLMN提供的NPN,内容也要少很多,下面的内容参考38.300,38.331 ,38.304,23.50…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

一文了解Android中的AudioFlinger

AudioFlinger 是 Android 音频框架中的一个核心组件&#xff0c;负责管理音频流的混合和输出。它是 Android 音频系统服务的一部分&#xff0c;作为音频框架和硬件之间的桥梁&#xff0c;接收应用程序的音频请求、进行混音处理&#xff0c;并最终通过音频硬件输出声音。 下面我…

基于YOLOv8深度学习的智慧交通事故评级检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOv8深度学习模型的智慧交通事故评级检测系统&#xff0c;旨在解决传统交通事故检测过程中效率低、误报率高等问题。该系统通过深度学习技术的应用&#xff0c;结合交通事故图像的分析&#xff0c;能够实现对事故的精准识别和评级&#xff0c;进而为…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

Android15之解决:Dex checksum does not match for dex:framework.jar问题(二百三十九)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

快速搭建Android开发环境:Docker部署docker-android并实现远程连接

目录 前言 1. 虚拟化环境检查 2. Android 模拟器部署 3. Ubuntu安装Cpolar 4. 配置公网地址 5. 远程访问 小结 6. 固定Cpolar公网地址 7. 固定地址访问 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊快速搭建Android开发环境&#x…

第十二章 并行Stream流

目录 一、引言 二、获取并行Stream流的两种方式 三、并行和串行Stream流的效率对比 四、parallelStream线程安全问题 五、parallelStream背后的技术 5.1. Fork/Join框架介绍 5.2. Fork/Join原理-分治法 5.3. Fork/Join原理-工作窃取算法 5.4. Fork/Join案例 一、引言 …

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色1.1.样式未生效原因&#xff1a;1.2.解决方法&#xff1a; 2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式)&#xff1a;2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&…

Excel单元格中自适应填充多图

实例需求&#xff1a;在Excel插入图片时&#xff0c;由于图片尺寸各不相同&#xff0c;如果希望多个图片填充指定单元格&#xff0c;依靠用户手工调整&#xff0c;不仅费时费力&#xff0c;而且很难实现完全填充。如下图中的产品图册&#xff0c;有三个图片&#xff0c;如下图所…

【C++笔记】vector使用详解及模拟实现

前言 各位读者朋友们&#xff0c;大家好&#xff01;上期我们讲了string类的模拟实现&#xff0c;这期我们开启vector的讲解。 一.vector的介绍及使用 1.1 vector的介绍 vector的文档 使用STL的三个境界&#xff1a;能用、明理、能扩展&#xff0c;下面学习vector&#xff…

LLM评测范式与方法

文章目录 基础大语言模型的评测微调大语言模型的评测不同评测方法的利弊为了有效地评估大语言模型的性能,一种主流的途径就是选择不同的能力维度并且构建对应的评测任务,进而使用这些能力维度的评测任务对模型的性能进行测试与对比。可供选择的能力维度包括但不限于本书所介绍…

3D Gaussian Splatting的全面理解

1.概述 高斯泼溅是一种表示 3D 场景和渲染新视图的方法,在“用于实时辐射场渲染的 3D 高斯泼溅3d-gaussian-splatting”这篇论文中被首先提出。它可以被认为是类似 NeRF模型型的替代品,就像过去的 NeRF 一样,高斯泼溅衍生出了许多新的研究工作,研究人员选择将其用作各种用…

《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人

课程 《生成式 AI》课程 第3講&#xff1a;訓練不了人工智慧嗎&#xff1f;你可以訓練你自己-CSDN博客 我们希望你创建一个定制的服务机器人。 您可以想出任何您希望机器人执行的任务&#xff0c;例如&#xff0c;一个可以解决简单的数学问题的机器人0 一个机器人&#xff0c…