【C++ 】stack 和 queue

1. 标准库中的stack

stack 的介绍:

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

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

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类

a. stack 的使用

注意:

如果要访问所有元素得到栈顶元素,再pop,直到为空

2. stack的模拟实现

代码

namespace lhy
{ template<class T,class container = vector<T>>class stack{public:void push(const T& x){_t.push_back(x);}void pop(){_t.pop_back();}size_t size(){return _t.size();}bool empty(){return _t.empty();}const T& top(){return _t.back();}private:container _t;};

//用法很像缺省参数,不过这里缺省的是类型

3. 标准库中的queue

queue 的介绍:

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

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

3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类

a. queue 的使用

4. queue的模拟实现

代码

namespace lhy
{ template<class T,class container = list<T>>class queue{public:void push(const T& x){_v.push_back(x);}void pop(){_v.pop_front();}bool empty(){return _v.size() == 0;}const T& back(){return _v.back();}const T& front(){return _v.front();}size_t size(){return _v.size();}private:container _v;};

5. priority_queue (优先级队列)

优先级队列的介绍:

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构

因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue

注意:

默认情况下priority_queue是大堆

a. priority_queue 的使用

  • priority_queue() (无参构造函数)
  • priority_queue(InputIterator first, InputIterator last)
  • empty() (判空)
  • push() (尾插)
  • pop () (删除栈顶元素,即第一个元素)
  • top() (返回栈顶元素)

6. priority_queue 的模拟实现

代码

namespace lhy
{template<class T>struct less{bool operator()(const T& x, const T& y){return x > y;}};template<class T>struct greater{bool operator()(const T& x, const T& y){return x < y;}};template<class T, class container = vector<T>, class compare = less<T>>class priority_queue{private:container con;void AdjustUp(int child){int parent = (child - 1) / 2;while (child > 0){if (compare()(con[parent], con[child])){std::swap(con[parent], con[child]);}else{break;}child = parent;parent = (child - 1) / 2;}}void AdjustDown(int parent){int child = parent * 2 + 1;while (child < size()){if (child + 1 < size() && con[child] > con[child + 1]){child++;}if (compare()(con[parent], con[child])){std::swap(con[parent], con[child]);}else{break;}parent = child;child = parent * 2 + 1;}}public:size_t size(){return con.size();}void push(const T & x){con.push_back(x);AdjustUp(size() - 1);}void pop(){swap(con[0], con[size() - 1]);con.pop_back();AdjustDown(0);}bool empty(){return con.empty();}const T& top(){return con[0];}};
}

代码注意事项

这两个类实际上又可以说成伪函数,这里通过比较大小判断建大堆还是小堆

用法如下:

compare()是匿名对象,后面接着是调用 less 类 或者 greater 类的运算符重载()

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

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

相关文章

Solidity 智能合约开发 - 基础:基础语法 基础数据类型、以及用法和示例

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本篇主要是做一个知识的整理和规划 作为一个类似文档的作用 更为简要和明了 具体的实现案例和用法 后续会陆续给出…

RUST 每日一省:rust logo收集

rust的logo集合&#xff0c;看看有没有你喜欢的&#xff0c;挑一个吧&#xff1b; GitHub - XuHugo/rust-logo: Collection of logo images for all rust languages 下边只是挑选了几个&#xff0c;更多的还是看github吧。

Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%

亲爱的社区小伙伴们&#xff0c;我们很高兴地向大家宣布&#xff0c;在 3 月 8 日我们引来了 Apache Doris 2.1.0 版本的正式发布&#xff0c;欢迎大家下载使用。 在查询性能方面&#xff0c; 2.1 系列版本我们着重提升了开箱盲测性能&#xff0c;力争不做调优的情况下取得较好…

第四百零二回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

Qt 线程池 QThreadPool

一.Qt 线程池 QThreadPool介绍 Qt线程池是一种管理多个线程的并发编程模型&#xff0c;通过使用线程池可以提高性能、控制并发度、提供任务队列和简化线程管理。 在Qt中&#xff0c;线程池的使用主要涉及以下几个步骤&#xff1a; 创建任务类&#xff1a;需要定义一个任务类&am…

javaweb数据传参类型(2)

前言 友友们好呀&#xff0c;今天来分享一下对于各种数据类型传参的问题&#xff0c;今天陪伴我们的云海 目录 前言 数组集合传参 补充 日期参数 补充 Json格式数据传参 补充 路径参数 补充 今日分享 ​​​​​​​数组集合传参 类似于我们之前进行的简单的参数传递…

【C++】string的底层剖析以及模拟实现

一、字符串类的认识 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&a…

Android14之禁止vbmeta.img签名校验(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

区别于传统家!三翼鸟定制智慧家电家居一体化场景

在这个科技创新、智能AI主导的时代&#xff0c;寻求更便捷智慧、舒心适宜、一体化的居家场景&#xff0c;成为一个时代的命题和竞赛&#xff0c;也是家居行业共同奔赴的使命。在纷繁复杂的竞争格局和方向答案中&#xff0c;一条清晰坚定的路径正在显露出来…… AWE前一天&…

Jsp在Javaweb中扮演什么角色?

1.什么是Jsp JSP&#xff08;Java Server Pages&#xff0c;Java 服务器页面&#xff09;是一种动态网页技术&#xff0c;它允许在 HTML 页面中嵌入 Java 代码&#xff0c;并由 Web 服务器在请求页面时动态生成 HTML 页面。JSP 通常用于创建动态 Web 内容&#xff0c;如交互式表…

影城管理系统|基于springboot框架+ Mysql+Java+B/S架构的影城管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

智慧文旅|AI数字人导览:让旅游体验不再局限于传统

AI数字人导览作为一种创新的展示方式&#xff0c;已经逐渐成为了VR全景领域的一大亮点&#xff0c;不仅可以很好的嵌入在VR全景中&#xff0c;更是能够随时随地为观众提供一种声情并茂的讲解介绍&#xff0c;结合VR场景的沉浸式体验&#xff0c;让观众仿佛置身于真实场景之中&a…

数据结构与算法--算法和算法分析

算法与数据结构之间存在密不可分的关系。简单来说&#xff0c;数据结构是存储和组织数据的方式&#xff0c;而算法则是操作和处理这些数据的方法。 首先&#xff0c;数据结构为算法提供了基础。算法是解决问题的步骤和流程&#xff0c;通过对数据结构进行操作&#xff0c;算法可…

【pyautogui】PyAutoGUI 的简单使用

文章目录 1 简介2 通用功能2.1 暂停/休眠/耗时2.2 自动防故障功能 3 鼠标控制3.1 移动鼠标3.2 获取鼠标指针位置3.3 点击鼠标3.4 拖动鼠标3.5 滚动鼠标3.6 常用方法 4 键盘控制4.1 输入字符串 write4.2 按键操作 press4.3 按下 & 释放4.4 组合键 hotkey4.5 键名 5 屏幕图像…

2.1 关系数据结构及形式化定义 数据库概论

目录 2.1.1 关系 关系&#xff1a;概念 1. 域&#xff08;Domain&#xff09; 2.笛卡尔积 元组&#xff08;Tuple&#xff09; 分量&#xff08;Component&#xff09; 基数&#xff08;Cardinal number&#xff09; 3. 关系 候选码&#xff08;Candidate key&#xf…

软件设计师17--磁盘管理

软件设计师17--磁盘管理 考点1&#xff1a;存储管理 - 磁盘管理调度算法磁盘调度 - FCFS磁盘调度 - SSTF例题&#xff1a; 考点1&#xff1a;存储管理 - 磁盘管理 存取时间寻道时间等待时间&#xff0c;训导时间是指磁头移动到磁道所需的时间&#xff1b;等待时间为等待读写的扇…

网工内推 | 上市公司网工,IE认证优先,最高18K*13薪,包吃住

01 深圳市宝腾互联科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、是整个数据中心的网络技术及安全问题的负责人&#xff0c;确保数据中心业务的正常进行&#xff1b; 2、负责规划、设计、搭建、维护数据中心的网络环境&#xff0c;确保IDC /云平台&a…

python INI文件操作与configparser内置库

目录 INI文件 configparser内置库 类与方法 操作实例 导入INI文件 查询所有节的列表 判断某个节是否存在 查询某个节的所有键的列表 判断节下是否存在某个键 增加节点 删除节点 增加节点的键 修改键值 保存修改结果 获取键值 获取节点所有键值 其他读取方式 …

[Kali] 安装Nessus及使用

在官方网站下载对应的 Nessus 版本:Download Tenable Nessus | TenableDownload Nessus and Nessus Managerhttp://www.tenable.com/products/nessus/select-your-operating-system这里选择 Kali 对应的版本 一、安装 Nessus 1、下载得到的是 deb 文件,与

【爬虫开发】爬虫从0到1全知识md笔记第1篇:爬虫概述【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫概述。selenium的其它使用方法。Selenium课程概要。常见的反爬手段和解决思路。验证码处理。chrome浏览器使用方法介绍。JS的解析。Mongodb的介绍和安装,小结。mongodb的简单使…