初识c++:stack和queue详解

news2024/9/20 0:53:47

本节大纲:

#stack和queue详解#

1.容器适配器

2.stack的介绍和使用

2.1 stack的介绍

2.2 stack的使用

3.stack的模拟实现

4.queue的介绍和使用

4.1 queue的介绍

4.2 queue的使用

5.queue的模拟实现

6.priority_queue的介绍和使用

6.1 priority_queue的介绍

6.2priority_queue的使用

7.priority_queue的模拟实现

目录

#stack和queue详解#

1.容器适配器

2.stack的介绍和使用

2.1 stack的介绍

2.2 stack的使用

3.stack的模拟实现

4.queue的介绍和使用

4.1 queue的介绍

4.2 queue的使用

5.queue的模拟实现

6.priority_queue的介绍和使用

6.1 priority_queue的介绍

6.2priority_queue的使用

7.priority_queue的模拟实现


1.容器适配器

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

而STL标准库中stack和queue的底层结构,虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque(双端队列),如下图:(deque是一种可以兼容stack和queue两者优点的底层默认容器)

2.stack的介绍和使用

2.1 stack的介绍

后进先出堆栈

堆栈是一种容器适配器,专门设计用于在后进先出环境(后进先出)下运行,其中元素仅从容器的一端插入和提取。

堆栈S 作为容器适配器实现,这些适配器是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素从特定容器的“背面”推出/弹出,该容器称为堆栈的顶部

底层容器可以是任何标准容器类模板,也可以是其他一些专门设计的容器类。集装箱应支持以下操作:

  • empty
  • size
  • back
  • push_back
  • pop_back


标准容器类,并满足这些要求。默认情况下,如果未为特定类实例化指定容器类,则使用标准容器。

如下图:

2.2 stack的使用

下图为stack的使用,第二张图为第一张图右边的中文翻译:

3.stack的模拟实现

模板和成员变量:

(1)插入数据

(2)删除top元素

(3)访问下一个数据(也就是提取栈顶top)

(4)返回容器大小和判断容器是否为空

4.queue的介绍和使用

4.1 queue的介绍

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。
2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供 一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
empty:检测队列是否为空
size:返回队列中有效元素的个数
front:返回队头元素的引用
back:返回队尾元素的引用
push_back:在队列尾部入队列
pop_front:在队列头部出队列
4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。
4.2 queue的使用
5.queue的模拟实现
模板和成员变量:
(1)插入元素和删除元素
(2)返回最后一个元素和返回第一个元素
(3)返回元素个数和判空
6.priority_queue的介绍和使用
6.1priority_queue的介绍
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过 随机访问迭代器访问,并支持以下操作:
empty():检测容器是否为空
size():返回容器中有效元素个数
front():返回容器中第一个元素的引用
push_back():在容器尾部插入元素
pop_back():删除容器尾部元素 
5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue 类实例化指定容器类,则使用vector。
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用 算法函数make_heap、push_heap和pop_heap来自动完成此操作。
6.2 priority_queue的使用
值得注意的是: 默认情况下,priority_queue是大堆。
在使用时我们应该包含头文件:
注意:下面用在一种叫做仿函数的一种类,下面两图是用来比较大小,进而来排升序或者降序
下图表示的是排降序:
下图表示的是排升序:
7..priority_queue的模拟实现
模板和成员变量:
(1)堆的向上调整算法和向下调整算法
(2)判空和返回元素个数
(3)访问top元素
(4)插入元素和删除top元素

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

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

相关文章

什么是docker?小白也能看懂!

👏大家好!我是和风coding,希望我的文章能给你带来帮助! 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝点击 我的主页 还可以看到和风的其他内容噢&#x…

什么是低代码?低代码开发和零代码开发的区别?

随着数字化时代的到来,企业对于软件开发的需求日益增长。为了提高开发效率和降低成本,越来越多的企业开始关注低代码和零代码平台,为没有编程背景的用户提供了创建应用程序的能力,极大地简化了开发过程。本文将什么是低代码&#…

企业实现数字化转型到底靠什么?5分钟给你讲明白数字化管理!

在数字化浪潮的推动下,企业数字化转型已不再是选择题,而是企业生存和发展的必答题。各种企业纷纷投入资源,采购各类数字化工具,希望能够借此步入数字化的大门。但是,是不是只要全面升级数字化工具,数字化转…

前端Web-JavaScript(上)

要想让网页具备一定的交互效果,具有一定的动作行为,还得通过JavaScript来实现, 这门语言会让我们的页面能够和用户进行交互。 什么是JavaScript JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言,是…

软件安全测试内容和方法大揭秘,湖南软件测评公司推荐

在当今信息社会飞速发展的背景下,软件的安全性问题愈发引起人们的重视。软件安全测试,作为提升软件安全性的重要环节,成为众多企业不可或缺的工作之一。 一、软件安全测试的定义与必要性   软件安全测试是指通过对软件进行系统性、全面性的…

gpt分区怎么修复引导?gpt分区修复引导多种方法

随着uefigpt(guid)分区的流行,越来越多的小伙伴经常遇到gpt分区引导丢失的情况,也不知道怎么修复,以前的一些修复工具都只能修复mbr格式下的硬引导,但对于gpt分区引导不是很清楚,gpt分区引导主要是靠分区中的esp分区来…

【IO】使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

不是哥们,脑子都烧起来了 1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源 思路: 1、首先创建了求文件长度的函数,在创建函数的时候&#xff…

短剧CPS分销系统框架+资源对接是怎么对接的?

目录 前言: 一、前端uniapp内容有什么? 二、后台管理 三、搭建CPS需要准备什么? 总结: 前言: 目前短剧目前在国内是非常的热门,观看的人群非常的多。如果希望能够通过推广短剧来做副业的话&#xff0c…

初阶数据结构.排序(2.2冒泡排序)

本节大纲: 冒泡排序 1.冒泡排序的思想 2.冒泡排序的特性 3.冒泡排序的实现 1.冒泡排序的思想 冒泡排序:是交换排序的一种,所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序…

GenAI 会消灭软件开发人员的工作吗?

软件开发人员、程序员和编码员之间最大的争论之一是,人工智能会抢走我的工作吗?是的!答案是肯定的;人工智能会抢走并取代你的工作。人工智能可能不会自己取代你,而是被使用人工智能的人取代。 我向 ChatGPT 提出了同样…

springboot银行客户管理系统代码--论文源码调试讲解

2 相关技术 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管理系统。MySQL由C语言和C语言构成,由于C语言和C语言是混合开发的,因此MySQL源码是生命期的。MySQL提供多种多样数据种类,常…

机器学习----神经网络技术详解

机器学习中的神经网络 1. 引言1.1 机器学习的概述1.2 神经网络的重要性和应用领域1.2.1 神经网络的基本概念1.2.2 神经网络的应用领域 2. 神经网络的基础知识2.1 神经网络的定义人工神经网络(ANN)的基本概念神经元的结构与功能 2.2 神经网络的历史背景早…

27、Python之面向对象:方生方死?对象生命周期是如何管理的

引言 前面关于面向对象的几篇文章,其实主要围绕着面向对象的第一个核心理念——封装,进行面向对象的介绍。从类、对象的静态构成的角度,对类与对象的定义及使用进行介绍。 在进入面向对象另外两个理念的介绍之前,我觉得有必要对…

回调函数和qsort,strcmp函数

有任何不懂的问题可以评论区留言,能力范围内都会一一回答 1.回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向…

【LLM大模型】GraphRAG入门学习流程

GraphRAG GraphRAG 是一种基于图的检索增强方法,由微软开发并开源。它通过结合LLM和图机器学习的技术,从非结构化的文本中提取结构化的数据,构建知识图谱,以支持问答、摘要等多种应用场景。GraphRAG的特色在于利用图机器学习算法…

7、springboot3 vue3开发平台-后端-获取用户菜单,构建菜单树列表

1. 获取用户信息并 从用户session 中获取用户信息 Operation(summary "查询当前用户菜单")GetMapping("/getSelfMenu")public Result<List<RouterVO>> getSelfMenu() {UserInfo userLoginInfo (UserInfo) StpUtil.getSession().get("u…

【Docker系列】Docker 中-d 和-it 的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python开发: 飞机大战 小游戏

玩法 你可以控制飞机左右移动,躲避敌机子弹,同时发射自己的炮弹,将敌人击落! 部署方案: 1、代码如下图; 2、将代码保存到一个python中,比如planeFight.py; 3、在你的电脑中安装python环境,然后使用命令:“py planeFight.py” 运行这个文件即可; 代码 import p…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

机器学习之贝叶斯方法

机器学习之贝叶斯方法 1. 贝叶斯定理基础1.1 贝叶斯定理公式1.2 先验概率 (Prior Probability)1.3 后验概率 (Posterior Probability)1.4 似然 (Likelihood)1.5 证据 (Evidence)1.6 贝叶斯定理的应用实例 2. 贝叶斯方法的基本概念2.1 条件概率 (Conditional Probability)2.2 全…