当前位置: 首页 > article >正文

stack,queue与deque

一.模拟实现stack和queue

STL中的stac和queuek是通过容器适配器来实现的,并不是直接实现栈。那什么是容器适配器呢?

举一个简单的例子,不同的插座需要不同的插头来连接,这时候我们用一个插座适配器,我们就不需要关心自己本身的插头,相当于加了一层中间层。

在STL中stack和queue就像适配器一样,只是对其他容器的接口进行封装,例如stack和queue在STl中就是用deque进行封装。

下面我们来进行模拟实现:

namespace ge
{template<class T,class Container = deque<T>>//不关心container是什么容器,container已经实现好的容器,通过对stack重新封装来完成class stack{public:stack()//构造函数没有内容会默认走private下的构造{}void push(const T& x){_con.push_back(x);}void pop(){_con.pop();}T& top(){return _con.top();}const T& top() const{return _con.top();}size_t size() const{return _con.size();}bool empty()const{return _con.empty();}private:Container _con;};
}

这里我的private内容是一个模板,用来传容器类型例如vector,list这样的。函数构造时会直接走private部分。其余部分就是对容器进行一个函数调用,较为简单。

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

stack和queue只需要在头尾进行访问不需要访问中间的元素,因此不需要迭代器来遍历。 

二.deque

deque是一个支持随机访问的容器,他的功能和vector和list功能类似。那么为什么要重新单独实现一个deque呢?vector优点在于支持下标随机访问,但是在扩容和中间插入时有一定效率缺陷。list可以高效的进行插入,但不支持随机访问。

所以deque是结合了两者的优点创建出来的容器,对两者进行功能的融合。

deque是一个双端队列支持首尾的插入和删除。deque存储数据时是使用一个buffer数组,当buffer数组存储满之后,再重新开辟一个buffer数组进行存储。通过一个中控器存储数组的指针将各个数组构造出一个假象的物理连续,其实他们在空间上并不是连续的。

与vector比较deque的优势是在头部插入和删除时不需要移动元素,效率较高。扩容时也不需要搬移元素。与list相比,他的底层空间是连续的空间利用率高。

但deque有个致命缺陷,当需要遍历时效率低下。

那为什么要选择deque作为stack和queue的底层容器呢?

stack和queue不需要遍历(不需要迭代器),只需要在两端进行操作。在数据增长时deque不需要搬移数据比vector效率要高。这样就完美避开了deque的缺点结合了其优点。

相关文章:

stack,queue与deque

一.模拟实现stack和queue STL中的stac和queuek是通过容器适配器来实现的&#xff0c;并不是直接实现栈。那什么是容器适配器呢&#xff1f; 举一个简单的例子&#xff0c;不同的插座需要不同的插头来连接&#xff0c;这时候我们用一个插座适配器&#xff0c;我们就不需要关心…...

Git清理本地残留的、但已经在服务器上被删除的分支

要筛选出已经被服务器删除的本地分支&#xff0c;并在本地删除这些分支&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤 1: 获取远程分支信息&#xff0c;确保本地的远程分支信息是最新的&#xff1a; git fetch -p步骤 2: 列出本地分支和远程分支&#xff1a; git …...

概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别

目录 消息生命周期 一、消息创建与发布阶段 二、消息路由与存储阶段 三、消息存活与过期阶段 四、消息投递与消费阶段 五、消息生命周期终止 关键配置建议 待消费的消息和待应答的消息 一、待消费的消息&#xff08;Unconsumed Messages&#xff09; 二、待应答的消息…...

【c++】时间复杂度与数据规模的对应关系

一、时间复杂度与数据规模的对应关系 &#xff08;以单核CPU每秒处理 (10^6) 次操作为基准&#xff09; 数据规模(n)可接受的时间复杂度最大操作次数估算适用算法示例≤ (10^2)O(n)、O(2ⁿ)≤ 1,000,000暴力搜索、全排列枚举≤ (10^4)O(n)、O(n log n)≤ (10^8)冒泡排序、Flo…...

多模态知识图谱融合

1.Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 1.1多模态实体对齐 1.2多模态实体链接 研究进展&#...

虚拟机配置nat上网

参考&#xff1a; https://www.jb51.net/server/33323640v.htm https://blog.csdn.net/m0_61560049/article/details/131502564 通过命令修改网络参数&#xff1a; sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 sudo route add default gw 192.168.1.1 eth0 通过…...

多宠识别:基于计算机视觉的智能宠物管理系统架构解析

一、行业痛点与技术方案演进 在多宠家庭场景中&#xff0c;传统方案面临三大技术瓶颈&#xff1a; 1. 生物特征混淆&#xff1a;同品种/毛色宠物识别准确率低于65% 2. 动态场景适应&#xff1a;进食/奔跑状态下的误检率达30% 3. 数据孤岛问题&#xff1a;离线设备无法实现持续…...

蓝桥杯-15届研究生组-A 劲舞团

思路和时间复杂度 思路&#xff1a;签到模拟题&#xff0c;但是思路也很重要&#xff0c;在K的重新赋值时&#xff0c;卡了一下&#xff0c;在不满足时间条件时&#xff0c;应该重置为1时间复杂度&#xff1a; 代码 #include <iostream> #include<cmath>…...

不小心更改了/etc权限为777导致sudo,ssh等软件都无法使用

修复流程 一、进入恢复模式&#xff08;无网络或无法登录时必选&#xff09; 1.重启系统&#xff0c;在 GRUB 启动菜单选择 Recovery Mode&#xff08;按 Shift 或 Esc 呼出菜单&#xff09;。2.以 root 身份挂载为可读写&#xff1a; bash 复制 mount -o remount,rw /确保文…...

最长重复子数组、最长公共子序列、判断子序列

20250307 题目区别dp数组含义的区别dp数组状态转移方程 代码随想录&#xff1a; 最长重复子数组 最长公共子序列 判断子序列 题目区别 最长重复子数组&#xff08;连续&#xff09;&#xff1a; 最长公共子序列&#xff08;不连续&#xff09;&#xff1a; 判断子序列 dp数…...

【数据分析】转录组基因表达的KEGG通路富集分析教程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍差异分析(limma)KEGG富集分析(enrichKEGG)可视化加载R包数据下载导入数据基因差异分析火山图KEGG通路富集分析可视化通路结果另一个案例总结系统信息参考介绍 KEGG富集分析,可…...

SpringBoot - 用责任链模式实现业务编排

文章目录 前因责任链&#xff1a;像工作台一样组织代码CodeSEQ3.1 定义处理器规范3.2 实现具体处理器3.3 共享上下文3.4 组装责任链 适用场景优势 前因 2000多行的业务逻辑里&#xff0c;各种校验规则、促销计算、库存操作像意大利面条一样缠绕在一起。最要命的是这样的代码结…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数

声明在 src/core/ngx_cycle.h ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);实现在 src/core/ngx_cycle.c ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle) {void *rv;char **senv;ngx_uint_t i, n;ngx_log_t …...

Vue 使用 vue-router 时,多级嵌套路由缓存问题处理

Vue 使用 vue-router 时&#xff0c;多级嵌套路由缓存问题处理 对于三级菜单&#xff08;或多级嵌套路由&#xff09;&#xff0c;vue 都是 通过 keep-alive 组件来实现路由组件的缓存。 有时候三级或者多级路由时&#xff0c;会出现失效情况。以下是三级菜单缓存的例子。 最…...

ResNet 改进:轻量级的混合本地信道注意机制MLCA

目录 1. MLCA注意力机制 2. 改进位置 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. MLCA注意力机制 MLCA(Mixed Local Channel Attention)是一种轻量级的混合本地信道注意机制,旨在提升卷积神经网络(CNN)在图像处理…...

【第22节】C++设计模式(行为模式)-Iterator(迭代器)模式

一、问题背景 Iterator 模式是设计模式中最为常见和实用的模式之一。它的核心思想是将对聚合对象的遍历操作封装到一个独立的类中&#xff0c;从而避免暴露聚合对象的内部表示。通过 Iterator 模式&#xff0c;我们可以实现对聚合对象的统一遍历接口&#xff0c;而不需要关心聚…...

FreeRTOS第15篇:FreeRTOS链表实现细节03_List_t与ListItem_t的奥秘

文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 FreeRTOS列表的核心数据结构 FreeRTOS的列表实现由两个关键结构体组成:List_t(列表)和ListItem_t(列表项)。它们共同…...

【Node.js入门笔记1---初始Node.js)】

Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

PyTorch基础语法万字解析

第一章&#xff1a;张量基础&#xff08;Tensor Fundamentals&#xff09; 1.1 张量创建 在PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;是用于表示数据的基本单元。它类似于NumPy中的数组&#xff0c;但额外支持GPU加速和自动微分功能。以下是几种创建张量的方…...

eclipse查看源码

查看 Collection 源码的步骤 打开 Eclipse。 在代码中定位到 Collection 接口&#xff1a; 例如&#xff0c;在代码中输入 Collection&#xff0c;然后按住 Ctrl 键并单击 Collection。 或者直接在代码中使用 Collection 的地方按 F3 键。 如果源码已关联&#xff1a; Ecl…...

robot:生而为奴

英文单词 robot&#xff0c;含义是”机器人“。 robot n.机器人 但其实&#xff0c;robot 这个单词的字面义&#xff0c;是生而为奴&#xff1a; robot rob打劫、搜刮 ot &#xff08;天生&#xff09;被剥削者 生而为奴 单词 bot&#xff0c;也指机器人&#xff0c;它是…...

计算机网络篇:基础知识总结与基于长期主义的内容更新

基础知识总结 和 MySQL 类似&#xff0c;我同样花了一周左右的时间根据 csview 对计算机网络部分的八股文进行了整理&#xff0c;主要的内容包括&#xff1a;概述、TCP 与 UDP、IP、HTTP&#xff0c;其中我个人认为最重要的是 TCP 这部分的内容。 在此做一篇目录索引&#xf…...

操作系统 2.3-用户级线程

多进程的回顾 多进程概念&#xff1a; 操作系统能够同时管理多个进程&#xff08;PID:1, PID:2, PID:3&#xff09;&#xff0c;每个进程可以独立执行一系列指令。 进程结构&#xff1a; 每个进程拥有自己的代码段、数据段、堆和栈。 进程控制块&#xff08;PCB&#xff09;…...

解决火绒启动时,报安全服务异常,无法保障计算机安全

1.找到控制面板-安全和维护-更改用户账户控制设置 重启启动电脑解决。...

2025-03-07 :详细介绍一下 Databricks 的 Lakehouse

Databricks 的 Lakehouse 是一种结合了数据湖和数据仓库优势的现代数据架构。它旨在解决传统数据湖和数据仓库的局限性&#xff0c;提供高效、灵活且可扩展的数据管理解决方案。以下是关于 Databricks Lakehouse 的详细介绍&#xff1a; 1. Lakehouse 的概念 Lakehouse 是一种…...

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡

在微信小程序中&#xff0c;事件分为 冒泡事件 和 非冒泡事件 &#xff1a; 冒泡事件&#xff1a;当一个组件的事件被触发后&#xff0c;该事件会向父节点传递&#xff1b;&#xff08;如果父节点中也绑定了一个事件&#xff0c;父节点事件也会被触发&#xff0c;也就是说子组…...

STM32点亮LED灯

1.1 介绍&#xff1a; LED模块。它的控制方法非常简单&#xff0c;要想点亮LED&#xff0c;只要让它两端有一定的电压就可以&#xff1b;实验中&#xff0c;我们通过编程控制信号端S的高低电平&#xff0c;从而控制LED的亮灭。我们提供一个测试代码控制LED模块上实现闪烁的效果…...

C++ primer plus 第七节 函数探幽完结版

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …...

共聚焦显微镜的使用操作流程

一、使用前准备&#xff1a; 在使用显微镜进行细胞制片观察之前&#xff0c;一系列细致的准备工作是必不可少的。首先&#xff0c;将废液缸从框架内取出&#xff0c;清空并清洗&#xff0c;确保无残留液体干扰后续实验。接着&#xff0c;倒取适量的PBS&#xff08;磷酸盐缓冲液…...

打破界限!家电行业3D数字化营销,线上线下无缝对接

家电行业正步入从增量市场向存量市场的转型期&#xff0c;消费者的观念日益成熟&#xff0c;对产品体验和服务质量的要求愈发严格。无论是线上电商平台还是线下实体店铺&#xff0c;提供个性化、增强体验感的产品与服务已成为家电市场未来发展的核心动力。51建模网凭借“3D数字…...