c++的学习之路:17、stack、queue与priority_queue

摘要

本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现,文章末附上代码以及思维导图。

目录

摘要

一、stack的介绍和使用

1、stack的介绍

2、stack的使用

3、stack的模拟实现

二、queue的介绍和使用

1、queue的介绍

2、queue的使用

3、queue的模拟实现

三、priority_queue的介绍和使用

1、priority_queue的介绍

2、priority_queue的使用

3、priority_queue的模拟实现

四、代码

1、stack

2、queue

3、priority_queue

五、思维导图


 

一、stack的介绍和使用

1、stack的介绍

和之前一样这里也是直接介绍一下文档,使用方式和之前的模板大差不差,如下方截图就是cplusplus的介绍,下面四点就是文档上面的翻译,其他的就不详细说了,数据结构里面有更加详细的介绍。

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:

empty:判空操作

back:获取尾部元素操作

push_back:尾部插入元素操作

pop_back:尾部删除元素操作

4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

44bcb71426bf4a689d374832a3cd9913.png

2、stack的使用

下面的一个表格就是常用的几个函数与接口说明,就不一一说明怎么使用了,和之前vector、list、string所演示的都差不多。

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

3、stack的模拟实现

这里是直接利用vector作为一个缺省值,直接用模板去创建一栈,这样都可以直接复用vector的函数,这样实现起来就十分容易加上轻松了,如下方代码所示,因为栈不支持迭代器,不能遍历只能一次出一个结果如下方图片所示,其实这里是我康吃康吃写了一个类似c写的那种,然后看了一下源码,大佬不愧是大佬,好轻松。

3e9aa157bed34855b94dd30a65279803.png

namespace ly1
{template<class T, class Container = vector<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_Stack(){stack<int> s1;s1.push(1);s1.push(2);s1.push(3);s1.push(4);while (!s1.empty()){cout << s1.top() << ' ';s1.pop();}cout << endl;}
}

 

 

二、queue的介绍和使用

1、queue的介绍

和之前一样这里也是直接介绍一下文档,使用方式和之前的模板大差不差,如下方截图就是cplusplus的介绍,下面四点就是文档上面的翻译,其他的就不详细说了,数据结构里面有更加详细的介绍。

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

empty:检测队列是否为空

size:返回队列中有效元素的个数

front:返回队头元素的引用

back:返回队尾元素的引用

push_back:在队列尾部入队列

pop_front:在队列头部出队列

4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

865bf7703b4848bb98ef3e6209d45ce2.png

2、queue的使用

下面的一个表格就是常用的几个函数与接口说明,就不一一说明怎么使用了,和之前vector、list、string所演示的都差不多。

函数声明接口说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列

3、queue的模拟实现

这里也是利用复用直接写的代码和测试如下。

20cbfa36b23d4182b3d06e44c00c6de2.png

namespace ly2
{template<class T, class Container = list<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_Queue(){queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);while (!q1.empty()){cout << q1.front() << " ";q1.pop();}cout << endl;}
}

三、priority_queue的介绍和使用

1、priority_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来自动完成此操作。

3d71be5c46fa4b24b82a51a625225966.png

2、priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。

函数声明接口说明
priority_queue()/priority_queue(first,
last)
构造一个空的优先级队列
empty( )检测优先级队列是否为空,是返回true,否则返回
false
top( )返回优先级队列中最大(最小元素),即堆顶元素
push(x)在优先级队列中插入元素x
pop()删除优先级队列中最大(最小)元素,即堆顶元素

3、priority_queue的模拟实现

这个原理有点像我之前写数据结构的堆,实现方法也差不多,这个优先队列可以进行排序,他默认是降序,代码实现与测试如下。

d2ad3092a0044fff9ccbc572b5f778f4.png

namespace ly3
{template<class T>struct less{bool operator()(const T& left, const T& right){return left < right;}};template<class T>struct greater{bool operator()(const T& left, const T& right){return left > right;}};template<class T, class Container = std::vector<T>, class Compare = less<T>>class priority_queue{public:priority_queue() : c() {}template<class Iterator>priority_queue(Iterator first, Iterator last): c(first, last){int count = c.size();int root = ((count - 2) >> 1);for (; root >= 0; root--)AdjustDown(root);}void push(const T& data){c.push_back(data);AdjustUP(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}const T& top()const{return c.front();}private:void AdjustUP(int child){int parent = ((child - 1) >> 1);while (child){if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);child = parent;parent = ((child - 1) >> 1);}else{return;}}}void AdjustDown(int parent){size_t child = parent * 2 + 1;while (child < c.size()){if (child + 1 < c.size() && Compare()(c[child], c[child + 1]))child += 1;if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}private:Container c;};void Test_Priority_Queue(){ly3::priority_queue<int> q1;q1.push(5);q1.push(1);q1.push(4);q1.push(2);q1.push(3);q1.push(6);while (!q1.empty()){cout << q1.top() << " ";q1.pop();}cout << endl;}
}

四、代码

1、stack

#pragma oncenamespace ly1
{template<class T, class Container = vector<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_Stack(){stack<int> s1;s1.push(1);s1.push(2);s1.push(3);s1.push(4);while (!s1.empty()){cout << s1.top() << ' ';s1.pop();}cout << endl;}
}

2、queue

#pragma oncenamespace ly2
{template<class T, class Container = list<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void Test_Queue(){queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);while (!q1.empty()){cout << q1.front() << " ";q1.pop();}cout << endl;}
}

3、priority_queue

#pragma oncenamespace ly3
{template<class T>struct less{bool operator()(const T& left, const T& right){return left < right;}};template<class T>struct greater{bool operator()(const T& left, const T& right){return left > right;}};template<class T, class Container = std::vector<T>, class Compare = less<T>>class priority_queue{public:priority_queue() : c() {}template<class Iterator>priority_queue(Iterator first, Iterator last): c(first, last){int count = c.size();int root = ((count - 2) >> 1);for (; root >= 0; root--)AdjustDown(root);}void push(const T& data){c.push_back(data);AdjustUP(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}const T& top()const{return c.front();}private:void AdjustUP(int child){int parent = ((child - 1) >> 1);while (child){if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);child = parent;parent = ((child - 1) >> 1);}else{return;}}}void AdjustDown(int parent){size_t child = parent * 2 + 1;while (child < c.size()){if (child + 1 < c.size() && Compare()(c[child], c[child + 1]))child += 1;if (Compare()(c[parent], c[child])){swap(c[child], c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}private:Container c;};void Test_Priority_Queue(){ly3::priority_queue<int> q1;q1.push(5);q1.push(1);q1.push(4);q1.push(2);q1.push(3);q1.push(6);while (!q1.empty()){cout << q1.top() << " ";q1.pop();}cout << endl;}
}

五、思维导图

2ce6242b15454aa6b6f0dcfe3a619a29.png

 

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

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

相关文章

算法训练营第34天|LeetCode 1005.K取反后最大化的数组和 134.加油站 135.分发糖果

LeetCode 1005.K取反后最大化的数组和 题目链接&#xff1a; LeetCode 1005.K取反后最大化的数组和 解题思路&#xff1a; 先处理负数&#xff0c;在处理最小的数。 代码&#xff1a; class Solution { public:int largestSumAfterKNegations(vector<int>& num…

uniapp引入微信小程序版本VantUI,使用VantUI的自定义tabbar,并解决自定义tabbar出现闪烁的情况

视频教程地址&#xff1a;https://www.bilibili.com/video/BV13m41167iG 1.uniapp引入微信小程序版本VantUI 去vant官网下载源码&#xff0c;源码放在github&#xff0c;自行去下载下来 https://vant-contrib.gitee.io/vant-weapp/#/home 在pages.json的globalStyle里面注册组…

php根据用户地址获取经纬度

记录&#xff1a;利用高德地图API&#xff0c;根据用户地址获取经纬度 API文档&#xff1a; https://lbs.amap.com/api/webservice/guide/api/georegeo 调用API代码 <?php /*** 服务器接口类*/ namespace queryAreaInfo;class queryArea{// 根据详细地址获取经纬度publi…

打印月历 Open Judge

题面链接: http://noi.openjudge.cn/ch0113/24/ 题目描述: 评析: 大模拟题&#xff0c;考察的是你的耐心和毅力&#xff01;很不错的模拟题练习题&#xff0c;小白(like me)可以练一练 思路: 先一个月一个月的模拟&#xff0c;求出来题目问的这个一年的这一个月的第一天是星期…

欧盟网络安全局:公共数据空间中的个人数据保护设计(上)

文章目录 前言一、背景:欧盟数据空间(一)欧盟数据空间的设计原则二、欧盟数据空间中数据保护的注意事项(一)欧盟数据空间关键术语(二)数据共享环境中输入隐私和输出隐私问题(三)数据保护工程的作用(四)数据空间中的数据保护影响评估(五)问责制的主要内容(六)通过…

Day30 回溯 LeedCode 332.重新安排行程 51. N皇后 37. 解数独 蓝桥杯 与或异或

332. 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK…

python selenium向html中写入内容

js_kind document.getElementById("returnName1").innerHTML"盾构设备(B010101)" self.Driver.execute_script(js_kind) 通过JS注入HTML代码 如果想输入带html格式的文本可以通过js注入&#xff0c;代码如下&#xff1a; from selenium import webdrive…

Macos 部署自己的privateGpt(2024-0404)

Private Chatgpt 安装指引 https://docs.privategpt.dev/installation/getting-started/installation#base-requirements-to-run-privategpt 下载源码 git clone https://github.com/imartinez/privateGPT cd privateGPT安装软件 安装&#xff1a; Homebrew /bin/bash -c…

java内存模型-DCL

DCL DCL&#xff08;Double-Checked Locking&#xff09;是一种用于实现线程安全的延迟初始化的技术。在Java中&#xff0c;DCL通常用于单例模式的实现。 DCL的基本思想是通过两次检查锁来实现延迟初始化。在第一次检查时&#xff0c;如果对象已经被初始化了&#xff0c;那么…

径流场水土流失自动监测系统的使用

TH-LS1随着环保意识的日益增强&#xff0c;水土流失问题已经成为全球关注的焦点。水土流失不仅破坏了生态环境&#xff0c;还对农业生产、水资源保护等方面产生了严重影响。为了有效监测和控制水土流失&#xff0c;径流场水土流失自动监测系统应运而生。 一、径流场水土流失自…

希尔排序解读

在算法世界中&#xff0c;排序算法是至关重要的一部分。而希尔排序&#xff08;Shell Sort&#xff09;作为一种基于插入排序的改进算法&#xff0c;通过允许交换非相邻元素&#xff0c;从而在一定程度上提高了排序效率。本文将深入探讨希尔排序的原理、实现方式以及它的性能特…

.net 实现的 Webscoket 对象的一些细节和疑问

这两天服务器和客户端进行了webscoket的联调&#xff0c;在和C#的webscoket实现联调的过程中&#xff0c;发现一些有趣的事情。 在我自己C的实现中&#xff0c;webscoket对上层应用而言是完全透明的&#xff0c;webscoket 只是一个传输协议&#xff0c;用户对此不需要有任何关…

Linux C++ 023-类模板

Linux C 023-类模板 本节关键字&#xff1a;Linux、C、类模板 相关库函数&#xff1a;getCapacity、getSize 类模板语法 类模板的作用&#xff1a;建立一个通用的类&#xff0c;类中的成员 数据类型可以不具体制定&#xff0c; 用一个虚拟的类型代表语法&#xff1a; templa…

stable diffusion的从安装到使用

stable-diffusion&#xff0c;一个免费开源的文生图软件&#xff0c;文章主要讲怎么从源码开始安装&#xff0c;以及使用的方式 git地址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui 本人电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前…

Java关键字保留字(共53个)

保留字&#xff08;2个&#xff09; 保留字&#xff08;Reserve Word&#xff09;&#xff1a;即它们在Java现有版本中没有特殊含义&#xff0c;以后版本可能会作为有特殊含义的词&#xff0c;或者该词虽然在Java中没有特殊含义&#xff0c;以后版本也不打算使用&#xff0c;但…

jeecg-boot 3.6使用微服务启动详细配置

1&#xff1a;运行sql文件 2&#xff1a;配置host 路径如下 127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-nacos 127.0.0.1 jeecg-boot-gateway 127.0.0.1 jeecg-boot-system 127.0.0.1 jeecg-boot-xxljob 127.0.0.1 jeecg-boot-rabbitmq 3…

LeetCode第十五题:三数之和【15/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

gitea详细介绍

Gitea 是一个轻量级、易于安装的 Git 服务&#xff0c;提供了类似于 GitHub 的功能&#xff0c;如代码托管、问题追踪、团队合作等。它使用 Go 语言开发&#xff0c;可以在自己的服务器上进行部署&#xff0c;从而实现自托管的 Git 服务。Gitea 具有用户友好的界面&#xff0c;…

数据研发八股文(1)

数据库 hadoop与spark结构 Hadoop和Spark在结构上都包含了多个核心组件&#xff0c;但它们的具体实现和用途有所不同。 Hadoop的结构主要包括HDFS&#xff08;Hadoop Distributed File System&#xff09;和MapReduce。HDFS是一个分布式文件系统&#xff0c;用于存储海量的数据…

【管理咨询宝藏52】AA银行企业文化策略分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏52】AA银行企业文化策略分析报告 【格式】PPT版本&#xff0c;可编辑 【关键词】战略规划、商业分析、管理咨询 【强烈推荐】这是一套市面上非常…