stack,queue
stack,queue
- stack的介绍和使用
- 介绍
- 使用
- 模拟实现
- queue的介绍和使用
- 介绍
- 使用
- 模拟实现
- priority_queue的介绍和使用
- 介绍
- 使用
- 模拟实现
- 容器适配器
- 概念
- 标准库中stack,queue的底层结构
- 介绍deque
- 原理
- 缺陷
- deque作为stack,queue底层默认容器
stack的介绍和使用
介绍
- stack是适配器的一种,专门用在具有先进后出的容器中,而且元素的删除,插入和提取都只能从容器的一端进行
- stack作为容器适配器被实现,容器适配器系对特定类进行封装作为其底层的容器,并提供一组特定的成员函数访问其元素,将特定类作为其底层的,元素特定容器的尾部被压入和弹出,不可遍历
- stack的底层容器可以是任何标准的容器类模板

使用
| 函数说明 | 接口说明 |
|---|---|
| stack() | 构造空栈 |
| empty() | 检测stack是否为空 |
| size() | 返回stack中元素的个数 |
| top() | 返回栈顶元素的引用 |
| push() | 将元素val压入stack中 |
| pop() | 将stack中尾部的元素弹出 |
模拟实现

模板中的第二个参数Class Container = deque<T>,Container是容器适配器,也就是用已存在的容器进行封装转换出自己想要实现的数据结构的底层容器,而且底层容器的功能可以直接使用,不再需要自己去实现底层容器及其相关功能,使用现成的,很大程度上提高效率。在这里,也就是用deque<T>作为底层容器,去实现stack类的数据结构
template<class T,class Container=deque<T>>class stack{public://数据入栈void push(const T& x){_con.push_back(x);}//数据出栈void pop(){_con.pop_back();}//提取栈顶数据const T& top(){return _con.back();}//检测栈是否为空bool empty(){return _con.empty();}//计算栈中有效元素的个数size_t size(){return _con.size();}private://deque作为底层容器创建变量Container _con;};
queue的介绍和使用
介绍
- 队列也是适配器的一种,专门用在先进先出的容器中,从容器一端插入元素,另一端提取元素
- 队列作为容器适配器实现,容器适配器系将特定容器进行封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队列头出队列。不可遍历
- 底层容器可以是标准容器模板之一

使用
| 函数说明 | 接口说明 |
|---|---|
| queue() | 构造空队列 |
| empty() | 检测队列是否为空 |
| size() | 返回队列中有效元素的个数 |
| front() | 返回队头元素的引用 |
| back() | 返回队尾元素的引用 |
| push() | 在队尾将元素val入队列 |
| pop() | 将队头元素出队列 |
模拟实现

将 deque<T>作为底层容器,通过其去实现 queue类的数据结构
template<class T,class Container=deque<T>>class queue{public://数据入队列void push(const T& x){_con.push_back(x);}//数据出队列void pop(){_con.pop_front();}//提取队头数据const T& top(){return _con.front();}//检测队列是否为空bool empty(){return _con.empty();}//计算队列中有效元素的个数size_t size(){return _con.size();}private://deque作为底层容器创建变量Container _con;};
priority_queue的介绍和使用
介绍
- 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的
- 优先队列的容器类似堆,在堆中可以随时插入元素,并且只能提取最大的元素,不可遍历
- 优先队列被实现为容器适配器,queue提供一组特定的成员函数来访问其元素。元素从容器的尾部弹出,其称为优先队列的顶部
使用
优先队列默认使用vector作为其底层存储数据的容器,在vector上使用堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue,默认情况下,priority_queue是大根堆
| 函数说明 | 接口说明 |
|---|---|
| priority_queue() | 构造空优先队列 |
| empty() | 检测优先队列是否为空 |
| top() | 返回优先队列中最大元素,即堆顶元素 |
| push(x) | 在优先队列中插入元素x |
| pop() | 删除优先队列中最大元素,即堆顶元素 |
模拟实现

根据上面的介绍,优先队列的本质上就是堆,所以选择vector<T>作为其底层容器;默认情况下,优先队列是大根堆,模板中的比较函数是less,所以如果需要将其改为小根堆的话,只需要将比较函数修改为greater即可
这里的比较函数Compare也称作仿函数
仿函数又称为函数对象是一个能行使函数功能的类,通过创建对象来实行函数功能
作为仿函数的类,都必须重载 operator() 运算符。调用仿函数,本质上就是通过类对象调用重载后的 operator() 运算符。
仿函数的实现
template<class T>//判断前一个数小于后一个数class less{public:bool operator()(const T& x, const T& y) const {return x < y;}};template<class T>//判断前一个数大于后一个数class greater{public:bool operator()(const T& x, const T& y) const{return x > y;}};
优先队列的实现
template<class T,class Container = vector<T>,class Compare = less<T>>class priority_queue{public://无参构造函数priority_queue(){}//迭代器构造函数template<class InputIterator>priority_queue(InputIterator first, InputIterator last):_con(first, last){for (int i = (_con.size() - 1 - 1) / 2; i >= 0; --i){adjust_down(i);}}//向上调整void adjust_up(size_t child){Compare com;size_t parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}//数据入堆void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}//向下调整void adjust_down(size_t parent){Compare com;size_t child = parent * 2 + 1;while (child < _con.size()){if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){child++;}if (com(_con[parent], _con[child])){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}//删除堆顶数据void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}//提取堆顶数据const T& top(){return _con[0];}//检测堆是否为空bool empty(){return _con.empty();}//计算堆中有效元素的个数size_t size(){return _con.size();}private://vector作为底层容器Container _con;};
容器适配器
概念
适配器是一种设计模式,该模式是将一个类的接口转换成客户希望的另外一个接口
标准库中stack,queue的底层结构
stack,queue本身也可以存放元素,但在STL中只是将其称为容器适配器,因为stack和queue只是对其他容器的接口进行了包装,STL中默认使用deque作为容器
介绍deque
原理
deque:一种双开口的“连续”空间的数据结构,可以在头尾两端进行插入和删除操作,并且时间复杂度为O(1),与vector相比,头插效率高,不需要搬移元素;与list相比,空间利用率比较高

deque并不是真正连续的空间,而是由一段连续的小空间拼接而成的,实际上deque类似于一个动态二维数组,其底层结构如下

缺陷
不适合遍历,在遍历时,deque的迭代器要频繁地去检测其是否移动到某段小空间的边界,导致效率低。在实际中,需要线性结构时,大多情况下优先考虑vector和list,deque的应用是,STL用其作为stack和queue的底层数据结构
deque作为stack,queue底层默认容器
stack是先进后出的特殊线性数据结构,因此是要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器;queue是先进先出的线性数据结构只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层结构,STL选择deque作为其底层容器的原因如下
- stack和queue不需要遍历,只需要再固定的一端或者两端进行操作
- 在stack中元素增长时,deque比vector的效率高;queue中元素增长时,deque不仅效率高,而且内存使用率高
总的来说就是,结合了deque的有点,并且完美地避开其缺点
相关文章:
stack,queue
stack,queuestack的介绍和使用介绍使用模拟实现queue的介绍和使用介绍使用模拟实现priority_queue的介绍和使用介绍使用模拟实现容器适配器概念标准库中stack,queue的底层结构介绍deque原理缺陷deque作为stack,queue底层默认容器stack的介绍和使用 介绍 stack是适…...
shiro反序列化
shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK:1.7 Tomcat:8.5.83 shiro源码:下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包:下载地址SHIRO-550/samples-…...
【GoF 23 概念理解】IoC/DI(控制反转/依赖注入)
搞清楚以下几个问题你就明白什么是 IoC/DI 了: 参与者都有谁?依赖:谁依赖于谁?为什么要依赖?注入:谁注入于谁?到底注入什么?控制反转:谁控制谁?控制什么&…...
stm32外设-GPIO
0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的…...
AfxMessageBox 自定义封装
一般情况下AfxMessageBox是系统提供的一个对话框,若要做这种效果的,必须重写。 实例1: void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…...
登入vCenter显示503,证书过期解决办法
登入vCenter显示503 原因:当安全令牌服务 (STS) 证书已过期时,会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌,从而导致无法按预期运行(证书两年后就会过期)。 解决办法&…...
设计模式(十九)----行为型模式之命令模式
1、概述 日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命…...
【数据库】数据库基础架构
数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统,因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层,一个是Server层,另一个是存储引擎层,而我们常用的就是MyISAM、InnoDB,主要负…...
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三💌发音小贴士:💌当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音 [ɔ…...
C++语法规则4(C++面向对象)
接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明为纯虚…...
【Spring 深入学习】AOP的前世今生之后续
AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程,一般可以帮助我们在不修改现有代码的情…...
软考高项——配置管理
配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括: 1)配置管理6个主要活动 2)配置项 3)配置基线 4)配置项的状态 5)配置库 6&a…...
网站SEO优化,网站TDK三大标签SEO优化,LOGO SEO优化
SEO(Search Engine Optimization)汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索 引擎内自然排名的方式。 SEO 的目的是对网站进行深度的优化,从而帮助网站获取免费的流量,进而在搜索引擎上提升网站的…...
select查询语句
worker表的字段有id, d_id, name, sex, birthday, salary, address 编号,部门号,姓名,性别,出生日期,工资,家庭住址 department表的字段有d_id, d_name, function, address 部门号,部门名,部门职能,部门位置 (1)查询worker表的所有记录(用*表示)。 select * fro…...
没有对象感,沟通太费劲
沟通中最重要的感觉:对象感! 要沟通的是谁?以啥方式最好? 趣讲大白话:蹲着跟小孩说话 【趣讲信息科技100期】 ******************************* 对象感是沟通者必须训练和提升的 是换位思考的一种能力 以便跟沟通对象进…...
智能优化算法之遗传算法
该算法已被很多篇文章讲解,本文将会去除很多较简单的内容,挑选认为重点核心部分进行讲述,内容中有属于信息的收集整理部分,也有属于自己理解的部分。 1、遗传算法概述 遗传算法是一类借鉴生物界的进化规律演化而来的随机化搜索方…...
【rabbitmq 实现延迟消息-插件版本安装(docker环境)】
一:插件简介 在rabbitmq 3.5.7及以上的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。 二:插件安装 1:选择适合自己安装mq 版本的插件࿱…...
【大数据】HDFS管理员 HaAdmin 集群高可用命令详细使用说明
高可用HaAdmin使用概览使用说明checkHealth查看NameNode的状态所有NN的服务状态查询指定NN的服务状态failovertransitionToActive概览 HDFS高可用特性解决了集群单点故障问题,通过提供了两个冗余的NameNode以主动或被动的方式用于热备,使得集群既可以从…...
京区航天研究所 哪些比较好的研究所?
第一梯队:一院一部、战术武器部、10所、12所、研发部、空天部,五院501所(总体设计部)、502所、通导部、遥感部、钱室(所人均年薪35w-50w级别) 第二梯队:一院14所、15所,二院未来实验…...
Nacos配置拉取及配置动态刷新原理【源码阅读】
Nacos配置拉取及配置刷新原理 一、初始化时获取配置文件 背景 SpringCloud项目中SpringBoot在启动阶段除了会创建SpringBoot容器,还会通过bootstrap.yml构建一个SpringCloud容器,之后会在准备上下文阶段通过SPI加载实现类后,会进行配置合并…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
