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

C++初阶(十五)Stack和Queue

文章目录

  • 一、Stack的模拟实现
  • 二、Queue的模拟实现
  • 三、容器适配器
    • 1、什么是容器适配器
    • 2、STL标准库中stack和queue的底层结构
    • 3、 deque的简单介绍(了解)
      • 1、deque的原理介绍
      • 2、deque的缺陷
    • 4、为什么选择deque作为stack和queue的底层默认容器


一、Stack的模拟实现

#include<iostream>
#include<deque>
#include<list>
using namespace std;
namespace bit
{template<class T, class Container = deque<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}T& top(){return _con.back();}private:Container _con;};
}
int main()
{bit::stack<int,list<int>> v;v.push(1);v.push(2);v.push(3);while (!v.empty()){cout << v.top() << " ";v.pop();}return 0;
}

二、Queue的模拟实现

#include<iostream>
#include<deque>
#include<list>
using namespace std;
namespace bit
{template<class T, class Container = deque<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}T& front(){return _con.front();}private:Container _con;};
}
int main()
{bit::queue<int,list<int>> v;v.push(1);v.push(2);v.push(3);while (!v.empty()){cout << v.front() << " ";v.pop();}return 0;
}

三、容器适配器

1、什么是容器适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
在这里插入图片描述

2、STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queu默认使用deque,比如:
在这里插入图片描述
在这里插入图片描述

3、 deque的简单介绍(了解)

1、deque的原理介绍

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
在这里插入图片描述
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:
在这里插入图片描述
双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:
在这里插入图片描述

那deque是如何借助其迭代器维护其假想连续的结构呢?
在这里插入图片描述

2、deque的缺陷

1、与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
2、与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。
3、但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

4、为什么选择deque作为stack和queue的底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和
queue默认选择deque作为其底层容器,主要是因为:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。
    结合了deque的优点,而完美的避开了其缺陷。

相关文章:

C++初阶(十五)Stack和Queue

文章目录 一、Stack的模拟实现二、Queue的模拟实现三、容器适配器1、什么是容器适配器2、STL标准库中stack和queue的底层结构3、 deque的简单介绍(了解)1、deque的原理介绍2、deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容器 一、Stack的模拟实现 #include<…...

C#面试题

基本概念 装箱和拆箱 装箱的过程&#xff0c;是将 值类型 转换为 引用类型 的过程&#xff1b; 拆箱则是将引用类型转换为值类型。 int val 100; object obj val; //装箱 int num (int) obj; //拆箱 委托(delegate) 委托&#xff08;Delegate&#xff09; 是存有对某个…...

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…...

二叉排序树的判断(二叉树的顺序存储):2022年408算法题

对于采用顺序存储方式保存的二叉树&#xff0c;根结点保存在SqBiTNode[0]中&#xff1b;当某结点保存SqBiTNode[i]中时&#xff0c;若有左孩子&#xff0c;则其值保存在SqBiTNode [2i1]中&#xff1b;若有右孩子&#xff0c;则其值保存在SqBiTNode[2i2]中&#xff1b;若有双亲结…...

Kubernetes版本升级到v1.18.0方法

升级k8s版本才能使用kube-prometheus安装监控 1、查看集群状态 [rootk8s-master k8s-script]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 5d22h v1.18.0 k8s-slave1 Ready <none> 4d10h v1.18.0 k…...

了解 git rebase

了解 git rebase 大多数人习惯使用 git merge 将更改从功能分支合并到主分支&#xff0c;但还有其他方法。我们是否曾经遇到过 git rebase 这个术语并想知道它是什么&#xff1f;或者我们可能听说过 rebase 和 merge &#xff0c;但不确定何时使用哪个&#xff1f;不用担心&am…...

程序员的养生之道:延寿健康的十大秘诀(下)

程序员的养生之道&#xff1a;延寿健康的十大秘诀&#xff08;上&#xff09;-CSDN博客 目录 6. 心理调节&#xff0c;减轻压力 6.1 程序员常见的心理问题 6.2 压力管理的重要性 6.3 放松技巧与应对策略 6.4 积极心态与心理健康 7. 正确坐姿&#xff0c;保护颈椎腰椎 …...

【java】保留前N月数据文件,定期删除数据

数据越积越多&#xff0c;过于冗余&#xff1b;数据库定期删除指定时间前的数据&#xff1b;文件生成的删除指定时间前端文件 SFTP文件定期删除 java sftp 定时清理指定文件中固定时间 依赖 <!-- ftp文件上传/下载Jar包 --> <dependency><groupId>com.jc…...

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…...

K8S学习指南(1)-docker的安装

文章目录 引言1. Windows 系统中安装 Dockera. 确认系统要求b. 下载 Docker Desktopc. 安装 Docker Desktopd. 配置 Docker Desktope. 验证安装 2. Ubuntu 系统中安装 Dockera. 更新包列表b. 安装依赖包c. 添加 Docker GPG 密钥d. 添加 Docker APT 仓库e. 安装 Dockerf. 添加用…...

vue3 + mark.js 实现文字标注功能

效果图 安装依赖 npm install mark.js --save-dev npm i nanoid代码块 <template><!-- 文档标注 --><header><el-buttontype"primary":disabled"selectedTextList.length 0 ? true : false"ghostclick"handleAllDelete"…...

运筹优化 | 模拟退火求解旅行商问题 | Python实现

"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…...

1017 A除以B

本题要求计算 A/B&#xff0c;其中 A 是不超过 1000 位的正整数&#xff0c;B 是 1 位正整数。你需要输出商数 Q 和余数 R&#xff0c;使得 ABQR 成立。 输入格式&#xff1a; 输入在一行中依次给出 A 和 B&#xff0c;中间以 1 空格分隔。 输出格式&#xff1a; 在一行中依…...

SAP UI5 walkthrough step8 Translatable Texts

在这个章节&#xff0c;我们会将一些文本常量独立出一个资源文件 这样的话&#xff0c;可以方便这些文本常量被翻译成任意的语言 这种国际化的操作&#xff0c;我们一般命名为i18n 新建一个文件i18n.properties webapp/i18n/i18n.properties (New) showHelloButtonTextSay …...

RocketMQ-源码架构二

梳理一些比较完整&#xff0c;比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xff0c;对消息持久化机制的设计&#xff0c;是…...

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…...

自动化测试框架 —— pytest框架入门篇

今天就给大家说一说pytest框架。 今天这篇文章呢&#xff0c;会从以下几个方面来介绍&#xff1a; 01、pytest框架介绍 pytest 是 python 的第三方单元测试框架&#xff0c;比自带 unittest 更简洁和高效&#xff0c;支持非常丰富的插件&#xff0c;同时兼容 unittest 框架。…...

String类详解

String类详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 解密String类&#xff1a;探秘Java中的字符串魔法 在Java的世界里&#xff0c;String类犹如一位魔法…...

Linux高级管理--安装MySQL数据库系统

MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务&#xff0c;凭借其高性能、高可靠和易于使 用的特性&#xff0c;成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySOL项目由MySQL AB公司进行开发&#xff0c;发布和支持&#xff0c;之后…...

团建策划信息展示服务预约小程序效果如何

团建是中大型企业商家每年举办的员工活动&#xff0c;其形式多样化、具备全部参与的娱乐性。但在实际策划流程及内容时&#xff0c;部分公司便会难以入手&#xff0c;术业有专攻&#xff0c;这个时候团建策划公司便会发挥效果。 如拓展训练、露营、运动会、体育竞技等往往更具…...

法学博士论文降重+溯源双突破:NotebookLM文献脉络追踪功能(实测引用准确率98.6%,超人工校验)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM法学研究辅助的范式变革 传统法学研究长期依赖人工检索、逐条比对判例与法条、手工整理文献脉络&#xff0c;知识关联深度受限于研究者个体经验与时间成本。NotebookLM 的引入&#xff0c;标…...

杰理之智能充电舱通信模块【篇】

固定 VOUT0/1 使用的通信 IO 为 P10/P11&#xff0c;固定使用 UART0。 SDK公版已经做好智能仓的基本通信交互了&#xff0c;耳机电量获取&#xff0c;状态获取&#xff0c;耳机配对等...

用Python从零复现混沌博弈算法(CGO):一个骰子如何玩转优化问题?

用Python从零复现混沌博弈算法&#xff08;CGO&#xff09;&#xff1a;一个骰子如何玩转优化问题&#xff1f; 混沌博弈算法&#xff08;Chaos Game Optimization, CGO&#xff09;是近年来兴起的一种新型智能优化算法&#xff0c;它将混沌理论与博弈思想巧妙结合&#xff0c;…...

MASA全家桶汉化包完整教程:让Minecraft模组界面彻底中文化

MASA全家桶汉化包完整教程&#xff1a;让Minecraft模组界面彻底中文化 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为MASA模组复杂的英文界面而烦恼吗&#xff1f;作为中文Minec…...

如何清除SQL表中的缓存垃圾_通过TRUNCATE重置表状态

...

不用登录!3 步把 Excel 进度表变成甘特图

很多团队并不是缺项目管理工具&#xff0c;而是缺时间&#xff1a;领导下午要进度图&#xff0c;表格还在同事电脑里&#xff0c;甘特图只能熬夜手画。PJMan 提供了一条「先出图、再决策」的轻路径&#xff1a;免登录 Excel 一键可视化。 为什么值得试&#xff1f; 零注册门槛&…...

大语言模型实战:从Transformer到QLoRA微调与RAG应用

1. 项目概述&#xff1a;为什么我们需要一门关于大语言模型的课程&#xff1f;如果你在过去一年里关注过技术圈&#xff0c;那么“大语言模型”这个词一定已经听得耳朵起茧了。从ChatGPT的横空出世&#xff0c;到各类开源模型的百花齐放&#xff0c;再到企业级应用的遍地开花&a…...

WRF-CHEM模拟翻车?可能是你的namelist.chem没设对(附MEIC数据实战配置清单)

WRF-CHEM模拟异常排查指南&#xff1a;MEIC数据与namelist.chem的深度适配 当WRF-CHEM模拟结果出现异常时&#xff0c;很多用户会第一时间怀疑MEIC数据处理环节的问题&#xff0c;但实际上&#xff0c;namelist.chem参数与MEIC特性的匹配度才是更隐蔽的关键因素。本文将带您深入…...

frp-panel:基于Web的图形化管理面板,让内网穿透配置更高效

1. 项目概述&#xff1a;一个为内网穿透工具打造的管理面板如果你用过 frp&#xff0c;大概率会和我有同样的感受&#xff1a;它的功能强大、性能稳定&#xff0c;是解决内网服务暴露、远程访问等问题的利器。但它的配置方式——编辑一个文本格式的.toml或.ini文件&#xff0c;…...

图像边缘检测算法全解析:从Sobel到Canny的实战指南

1. 项目概述&#xff1a;从“看见”到“看懂”的第一步在机器视觉的世界里&#xff0c;让计算机“看见”只是第一步&#xff0c;真正的挑战在于让它“看懂”。而“看懂”一幅图像&#xff0c;往往始于识别其轮廓与边界。这就是“边缘检测”的核心价值所在——它如同视觉系统的“…...