【C++】栈和队列、优先级队列、适配器原理

news/2024/9/17 7:17:58/ 标签: java, 开发语言, jvm, c++, c语言, 数据结构

目录

一.栈和队列相关接口

二.适配器介绍

三.栈和队列模拟实现

四.deque介绍

五.优先级队列

六.优先级队列的模拟实现

1.基本结构

2.插入删除操作


一.栈和队列相关接口

1.栈(Stack)的接口

由于栈接口只能支持栈顶插入(入栈),栈顶删除(出栈),因此接口很少,这里都是熟悉的接口 。如果对于栈和队列不熟悉,可以参考我之前用C语言实现栈和队列的深度解析: 

数据结构】栈和队列-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/2301_80555259/article/details/138817611

2.队列(Queue)的接口

队列相比于栈只多了一个接口:back,用于取队尾数据,队列的front相当于栈的top 


二.适配器介绍

无论是栈还是队列,其模板参数中都有一个Container,缺省值为deque<T>,这里就要引入一个叫做“适配器”的概念

 

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

一个非常典型的例子就是插头的适配器:

那么在数据结构中,这种适配器是什么呢?

在C语言实现栈时,我们实现栈的底层实际上是顺序表,也就是把顺序表做了一层封装和限制,让它的功能变得和栈一样,这里C++也是同理:在实现栈的时候不用再去手搓一个顺序表,可以直接调用库里的vector类! 


三.栈和队列模拟实现

和标准库里的模板一样,由于栈要复用其他数据结构,所有在定义模板时有两个模板参数

//deque后续会解释
template<class T, class Container = deque<T>>
class Stack
{//......
private:Container _con;
}

这样实现栈就会非常方便,不用写构造函数和析构函数,因为默认生成的构造和析构会去调用内嵌类型的构造和析构帮助我们完成任务

//注:以下的push_back和 back等都是vector中的
void push(const T& val)
{_con.push_back(val);
}void pop()
{_con.pop_back();
}T& top()//可读可写
{return _con.back();
}const T& top() const
{return _con.back();
}bool empty() const
{return _con.empty();
}size_t size() const
{return _con.size();
}

 栈的实现就完成了,至于队列是很相似的,这里就不再继续实现队列了。


四.deque介绍

deque又被称作双端队列,是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,同时时间复杂度都为O(1),与vector比较,头插效率高,不需要频繁挪动元素,而与list相比则空间利用率比较高 

  接下来看看deque的对应接口:

可以发现deque不仅既有头插尾插,头删尾删,并且还支持方括号[]访问 ,难道它底层也是连续的物理空间吗?

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

注意deque有一个中控数组的概念,deque扩容就是直接开辟一份空间,再让中控数组指向新开辟的空间,再将原先空间的内容拷贝至新空间 


五.优先级队列

priority_queue(优先级队列)简单介绍

  1. 优先级队列是一种容器适配器,它的第一个元素总是它包含的元素中最大的(默认是大堆)
  2. 类似于堆,在堆中可以随时插入元素,并始终在内部保持堆的结构,只能检索最大堆元素(优先级队列中位于最顶部的元素)
  3. 底层容器可以是任何标准的容器类模板,不过容器需要支持随机迭代器(random access iterator)以及以下功能:
  • empty():检测容器是否为空
  • size():返回容器中有效元素个数
  • front():返回容器中第一个元素的引用
  • push_back():在容器尾部插入元素

    vector类和deque类都满足这些需求,默认情况下,若没有指定容器,则默认使用vector

优先级队列默认有三个模板参数,第三个就是来决定此优先级队列是大堆还是小堆,它叫仿函数,会下一篇文章讲解,这里先不管它,我们需要做到的是,默认的less是大堆,若我们显式传参greater,那么就是小堆  

优先级队列的接口

函数功能
priority_queue()构造一个空的优先级队列
priority_queue(first, last)用迭代器区间构造一个优先级队列
empty()检测是否为空
top()返回优先级队列中最大(最小)元素,即堆顶元素
push(x)在优先级队列中插入元素x
pop()删除优先级队列中最大(最小)元素,即堆顶元素

六.优先级队列的模拟实现

1.基本结构

template<class T, class Container = vector<T>>
class Priority_queue
{
public://成员函数
private:Container _con;//此容器默认是vecto
};

2.插入删除操作

由于优先级队列实际上就是一个堆,所以在插入删除之后要进行向上调整或向下调整以保持堆的结构,那么对应的操作就很熟悉了

//向上调整
void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}//向下调整
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){if (a[child+1] < a[child] && child + 1 < n){child++;}if (a[child] < a[parent]){swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}//堆的插入
void push(const T& val)
{_con.push_back(val);adjust_up(_con.size() - 1);
}//堆的删除
void pop()
{std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);
}

 插入和删除可谓是和堆一模一样的做法,其余的函数接口也都是如此,这里就不过多实现了,明白了优先级队列的大致原理即可



http://www.ppmy.cn/news/1522524.html

相关文章

机器学习-神经网络:循环神经网络(RNN)详解

引言 在当今人工智能(AI)和深度学习(DL)领域,循环神经网络(RNN)作为一种专门处理序列数据的模型,具有不可忽视的重要性。RNN 的设计目标是模拟和处理序列中的时间依赖关系,使其成为许多应用场景的理想选择,如自然语言处理(NLP)、时间序列预测和语音识别等。它不仅…

2024年高教社杯数学建模国赛C题超详细解题思路分析

本次国赛预测题目难度&#xff0c;选题人数如下所示 难度评估 A:B:C 1.8:1.3:1 D:E1.5:1 选题人数 A:B:C 1:1.5:2.8 D:E0.5:1.2 C题一直以来都是竞赛难度最低、选题人数最多的一道本科生选题&#xff0c;近三年C题的选题人数一直都是总参赛队伍的一半左右&#xff0c;2023年…

ComfyUI 基础教程—— 应用 Controlnet 精准控制图像生成

一、前言 你是否有见过下面类似这样的图片&#xff1a; 看起来平平无奇&#xff0c;当你站远点看&#xff0c;或者把眼睛眯成一条缝了看&#xff0c;你会发现&#xff0c;这个图中藏有一些特别的元素。这就是利用了 Ai 绘画中的 ControlNet&#xff0c;实现对图片的相对更精…

高分辨率音频和传统音频区别

是不是很好奇高分辨率音频和传统音频区别在那里&#xff1f;什么场景更需要高分辨率音频&#xff1f;下面我们一起来理解一下。 高分辨率音频和传统音频主要区别在于其音质和数据的详细程度&#xff1a; 分辨率&#xff1a;高分辨率音频的采样率和比特深度高于传统音频。例如…

通过组合Self-XSS + CSRF得到存储型XSS

在一次漏洞赏金挖掘中&#xff0c;我在更改用户名的功能点出发现了一个XSS&#xff0c;在修改用户名的地方添加了一个简单的XSS payload并且刷新页面&#xff1a; 用户设置面板 XSS证明 但是问题是这个功能配置并不是公共的&#xff0c;造成XSS漏洞的唯一方法是告诉受害者将其…

【B题第二套完整论文已出】2024数模国赛B题第二套完整论文+可运行代码参考(无偿分享)

2024数模国赛B题完整论文 摘要&#xff1a; 随着电子产品制造业的快速发展&#xff0c;质量控制与成本优化问题成为生产过程中亟待解决的核心挑战。为应对生产环节中的质量不确定性及成本控制需求&#xff0c;本文结合抽样检测理论和成本效益分析&#xff0c;通过构建数学模型…

【最新】高效可用的Docker仓库源

1.背景 在安装k8s过程中&#xff0c;遇到了docker拉取镜像失败的问题&#xff0c;换了很多仓库源&#xff0c;要么是慢&#xff0c;要么是失效了。在不断踩坑过程中&#xff0c;居然发现了一个比较好用的仓库源&#xff1a;毫秒镜像&#xff0c;赶紧分享出来。如果哪天失效了&…

两种在wordpress网站首页调用woocommerce产品的方法

要在WordPress网站首页调用WooCommerce产品&#xff0c;您可以使用以下方法&#xff1a; 方法1&#xff1a;使用WooCommerce Shortcode WooCommerce提供了一个内置的shortcode&#xff0c;可以直接在WordPress页面或帖子中插入产品。要在首页显示指定数量的产品&#xff0c;请…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

uni-app流式接受消息/文件

uni-app流式接受消息/文件 问题描述 今天利用fastgpt搭建了一个局域网进行访问Ai助理&#xff0c;在前端通过api接口进行请求&#xff0c;用于接收后端的发送的流式消息&#xff0c;那么前端可以进行流式的获取到这个消息&#xff0c;也可以进行直接进行在请求发送完成以后&a…

src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录

(venv) shgbitaishgbitai-C9X299-PGF:~/pythonworkspace/ai-accompany$ pip install pyaudio sounddevice Collecting pyaudioDownloading PyAudio-0.2.14.tar.gz (47 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47.1/47.1 kB 644.…

Linux中的Vim文本编辑器

Linux中的Vim是一个非常强大的文本编辑器&#xff0c;它提供了丰富的命令来支持各种文本编辑操作。以下是一个Vim常用命令的详细总结&#xff0c;涵盖了基本操作、编辑命令、移动光标、查找替换、保存退出等多个方面。 一、基本操作 启动Vim vim&#xff1a;直接启动Vim编辑器…

Rust模块std::thread

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 Rust多线程编程概述-CSDN博客 12.…

4 路由模式

路由模式 逻辑图 如果我们将生产环境的日志进行处理&#xff0c;而日志是分等级的&#xff0c;我们就按照 error waring info三个等级来讲解 一个消费者是处理【所有】&#xff08;info&#xff0c;error&#xff0c;warning&#xff09;的日志&#xff0c;用于做数据仓库&am…

简说目前市面上最流行的“AI Agentic”

背景 当吴恩达在布道完著名的Agent设计模式后 他于不久后又引领了AI界的开发们开始关注另一种高级开发模式&#xff0c;即"Agentic"&#xff0c;吴恩达多次反复强调&#xff1a;“Agentic是比Agent更具未来”。 那么什么是Agentic呢&#xff1f; 什么是AI Agentic…

新换了电脑,电脑里常用的6款软件,下载回来继续用

新换了电脑&#xff0c;准备把之前电脑里常用的几款软件都下载回来继续用&#xff0c;独乐乐不如众乐乐&#xff0c;分享一下~ 1、Listen 1 一款开源、免费的音乐播放器&#xff0c;它能够整合多个主流音乐平台的资源&#xff0c;包括网易云音乐、QQ音乐、酷狗音乐、酷我音乐、…

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱&#xff0c;所以长远&#xff01;NSSCTF平台秉承着开放、自由、共享的精神&#xff0c;欢迎每一个CTFer使用。https://www.nssctf.cn/problem [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页 我们一般按F12或者是右键查…

WorkPlus安全即时通讯:端到端加密开启信息保密新时代

在数字化时代&#xff0c;信息的保密性和安全性变得越发重要。企业和个人需要确保他们的敏感信息和机密通讯不会落入黑客或第三方的手中。为了满足这一需求&#xff0c;WorkPlus安全即时通讯平台应运而生。作为一款拥有端到端加密功能的通讯平台&#xff0c;WorkPlus着重于保护…

小米Vela:端侧AI推理框架

小米Vela是小米公司基于开源实时操作系统NuttX打造的物联网嵌入式软件平台。该平台旨在为各种物联网硬件提供统一的软件服务&#xff0c;支持丰富的组件和易用的框架&#xff0c;以打通碎片化的物联网应用场景。2024年8月在“开源中国开源世界”大会&#xff0c;小米对外公开超…

python 解析数据后保存到excel

openpyxl 特点&#xff1a; 支持读写Excel 2010 xlsx/xlsm/xltx/xltm文件格式。可以操作Excel的几乎所有功能&#xff0c;如样式、图表、图片等。适用于复杂的Excel操作&#xff0c;例如公式、数据验证和条件格式。社区支持较好&#xff0c;文档比较完善。 优点&#xff1a; 功…