初识C++ · 模拟实现stack和Queue

目录

前言:

1 Stack

1.1 双端队列

2 Queue


前言:

经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列:

文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它们的大体结构我们都是了解的,在数据结构初阶我们已经用了C语言进行实现,这里用C++进行实现。


1 Stack

根据文档,stack也是使用了模板,第一个参数是数据类型,那么第二个是?

我们在C语言阶段使用的是一个整型指针,一个size一个capacity来实现,如果我们在C++仍然这样实现就不用介绍了,没意思了就。

后面的参数deque是另一种结构,叫做双端队列,后面细说,为什么引入第二个模板参数呢?

因为我们有了vector list基础,完全可以复用的,为什么复用vector list,就和deque有关了。

1.1 双端队列

deque是双端队列,那么为什么在stack queue的模板参数里面都有这个结构呢?

因为这个结构集成了vector和list,但是不是只集成了它们的优点。


先简单谈谈deque的结构

list的优点是插入删除效率很高,缺点是不好访问数据,vector的优点是访问任意数据的效率很高,缺点是插入删除数据如果在头部或者中间的效率很低。

所以惠普的大佬就寻思再来一个结构,可以当vector用也可以当list使用,这里因为是了解,所以就直接给结构了:

 看起来就像是个大boss,当我们存数据的时候,该结构会开一块空间,比如叫buff,空间大小为16,当一直插入数据,该数据插满之后,不会扩容,会重新开一块空间,空间大小也是16,数据插好后,我们该如何快速访问呢?
假定开的空间大小不变,我们想访问第i个数据,一块空间的大小为N,那么我们就应该先找到i数据在第几个空间的,在找该数据在第几个,找到在哪个空间可以i / N,第几个可以i % N,这样就可以快速访问了。

那么这么多空间应该如何管理?

这里使用的是中控指针,即再开一块空间,这块空间里面只有指针,指针指向不同的空间,但是指针是从中间开始存储的,因为涉及到头插。

但是对于deque的结构来说,只有两个迭代器,一个迭代器有4个指针,分别指向当前节点,头结果,尾节点和中控指针的节点,如果涉及到了插入删除数据,比如头插,就要先开一块空间,倒着存数据,那么此时找数据,i就要先减去这个不满的第一个数据块的数据个数,才能通过/ % 快速访问数据。中间插入数据的时候,有两个选择,一是重新开空间,二是在原来的空间上扩容,但是扩容之后,每个空间的大小不一样,找数据的效率就会降低了。

当涉及删除数据的时候,删除了之后,后面的数据往前移动,比较麻烦。

所以别看deque集成了list vector,缺点也蛮多的。

比如访问数据的效率不极致,中间插入删除数据也没list快,它就比较尴尬。。

这也是为什么,stack queue的模板参数默认是deque,这个"大哥"虽然有点缺点,但是用起来也算不错。


我们在stack实现的接口有入栈 出栈 size empty 返回栈顶元素,只有5个接口,这5个接口在vector里面都有,所以,直接使用:

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

这里有个很牛逼的点就是,模板参数也可以有缺省值,我们给上vector<int>,那么默认的用vector来实现stack。

测试代码如下:

#include "Stack.h"
using namespace Free3;
int main()
{Free3::stack<int, vector<int>> s1;Free3::stack<int> s2;s1.push(1);s1.push(2);s1.push(3);s1.push(4);	s2.push(1);s2.push(2);s2.push(3);s2.push(4);s2.push(5);while (!s2.empty()){cout << s2.top() << " ";s2.pop();}cout << endl;return 0;
}

2 Queue

队列这里还有点不一样,栈可以用vector也可以用list,但是队列不行,队列的出队,相当于是头删,如果非要用vector里面的erase来头删也可以,但是效率很差,是O(N),这里就非常不推荐,所以队列就用list来实现。

namespace Free4
{template<class T>class Queue{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}size_t size(){return _con.size();}T& front(){return _con.front();}bool empty(){return _con.empty();}private:list<T> _con;};}

感谢阅读!

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

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

相关文章

平板显示LED背光芯片OC6700,输入3.6V~60V,升压型 LED 恒流驱动器

概述 OC6700是一款内置60V功率NMOS高效率、高精度的升压型大功率LED恒流驱动芯片。OC6700采用固定关断时间的控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。OC6700通过调节外置的电流采样电阻&#xff0c;能控制高亮度LED灯的…

LangChain v0.2介绍

LangChain v0.2介绍 LangSmith&#xff1a;一个开发者平台&#xff0c;可调试、测试、评估和监控LLM应用程序。 LangServe&#xff1a;用于将 LangChain 链部署为 REST API 的包。可以轻松启动并运行生产就绪的 API。 LangChain&#xff1a;包含构成认知架构的链、代理和检索策…

香橙派Orange AI Pro / 华为昇腾310芯片 部署自己训练的yolov8模型进行中国象棋识别

香橙派Orange AI Pro / 华为昇腾310芯片 部署自己训练的yolov8模型进行中国象棋识别 一、香橙派简介1.1、香橙派 AI Pro 硬件资源介绍1.2、华为昇腾310&#xff08;Ascend310&#xff09; 简介1.3、 昇腾310AI能力和CANN 简介昇腾310 NPU简介 二、远程环境配置2.1、ssh2.2、vnc…

springboot管理的各依赖版本查看

找一个springboot相关的依赖&#xff0c;比如这里我找mybatis 鼠标点击artifactId名称&#xff0c;图中蓝色字段&#xff0c;跳转到springboot依赖&#xff08;鼠标悬停在上面变成蓝色表示可点击跳转&#xff09;&#xff0c; 点击spring-boot-dependencites&#xff0c;跳转到…

list(二)和_stack_queue

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;二&#xff09;以及_stack_queue&#xff0c;下面让我们开始今天的学习吧&#xff01; list(二)和_stack_queue 1.list的构造函数 2.设计模式之适配器和迭代器 3.新容器de…

产品人生(9):从“波士顿矩阵”看“个人职业规划”

波士顿矩阵&#xff08;简称BCG矩阵&#xff09;是一种战略规划工具&#xff0c;由波士顿咨询公司的创始人布鲁斯亨德森&#xff08;Bruce Henderson&#xff09;于1970年代初提出的&#xff0c;它以两个关键指标作为分析维度&#xff1a;市场增长率和相对市场份额&#xff0c;…

k8s牛客面经篇

k8s的pod版块: k8s的网络版块: k8s的deployment版块: k8s的service版块: k8s的探针板块: k8s的控制调度板块: k8s的日志监控板块: k8s的流量转发板块: k8s的宏观版块:

【InternLM实战营第二期笔记】04:XTuner 微调 LLM:1.8B、多模态、Agent

文章目录 笔记微调基础知识Xtuner8G显存微调模型InternLM2 1.8B多模态实践环节数据微调过拟合WebUI 交互 多模态微调 作业 这回学乖了&#xff0c;打开本节课第一件事先不看教程而是装环境~ 笔记 微调基础知识 这里感慨一下&#xff0c;垂直领域的训练还是挺困难的&#xff0c;…

docker安装redis以及持久化

为了避免当虚拟机关机后redis数据丢失的情况&#xff0c;redis需要持久化。所以要挂载数据卷 创建数据和配置存放的目录 [root192 data]# pwd /root/data [root192 data]# mkdir -p /root/data/redis/conf && chmod 777 /root/data/redis/conf [root192 data]# mkdir …

php反序列化中的pop链

目录 一、什么是POP 二、成员属性赋值对象 例题&#xff1a; 方法一 方法二 三、魔术方法的触发规则 例题&#xff1a; 四、POC的编写 例题1&#xff1a; 例题2 [NISACTF 2022]babyserialize 今日总结&#xff1a; 一、什么是POP 在反序列化中&#xff0c;我们…

项目资源管理

目录 1.概述 2.六个过程 2.1. 规划资源管理 2.2. 估算活动资源 2.3. 获取资源 2.4. 建设团队 2.5. 管理团队 2.6. 控制资源 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 资源规划 3.2.2. 资源分配 3.2.3. 资源获取 3.2.4. 资源优化 3.2.5. 资源监控与…

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&#xff…

ES 生命周期管理

一 .概念 ILM定义了四个生命周期阶段&#xff1a;Hot&#xff1a;正在积极地更新和查询索引。Warm&#xff1a;不再更新索引&#xff0c;但仍在查询。cold&#xff1a;不再更新索引&#xff0c;很少查询。信息仍然需要可搜索&#xff0c;但是如果这些查询速度较慢也可以。Dele…

Java面试——中间件

OpenFeign 1、openFeign是一个HTTP客户端&#xff0c;它融合了springmvc的注解&#xff0c;使之可以用REST风格的映射来请求转发。 2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射&#xff0c;亦或是作为service层处理逻辑&#…

C++ priority_queue简单源码剖析:priority_queue模拟实现

文章目录 1. priority_queue介绍2. priority_queue模拟实现3. 适配器与虚函数 大家好&#xff01;本文会用C模拟一个基本的priority_queue类&#xff0c;帮助我们更好的理解priority_queue的内置函数的实现与规则。 1. priority_queue介绍 priority_queue被叫做优先队列&#…

ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA&#xff08;Platform&#xff09; 什么是OTA&#xff1a; OTA&#xff08;Over-the-AirTechnology&#xff09;即空中下载技术&#xff0c;是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网&#xff08;IOT&am…

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈&#xff1a;数据结构——栈(C语言版)-CSDN博客 C语言队列&#xff1a;数据结构——队列&#xff08;C语言版&#xff09;-CSDN博客 前言&#xff1a; 在之前学习C语言的时候&#xff0c;我们已经学习过栈与队列&#xff0c;并学习过如何使用C语言来实现栈与队列&…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响&#xff1f;标准答案就是&#xff1a; “启用多因素身份验证”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

步进电机双闭环细分控制(matlab仿真)内含课设等参考文件

1.1 步进电机工作原理 步进电机是一种用电脉冲进行控制&#xff0c;将电脉冲信号转换成相位移的电机&#xff0c;其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度。脉冲的数量决定了旋转的总角度&#xff0c;脉…