C++: stack 与 queue

目录

1.stack与queue

stack

queue

2.priority_queue

2.1相关介绍

2.2模拟实现priority_queue

--仿函数:

--push

--pop

--top

--size

--empty

--迭代器区间构造

2.3仿函数

3.容器适配器

stack模拟实现

queue模拟实现


学习目标:

1.stack和queue介绍与使用

2.priority_queue的介绍和使用

3.容器适配器

1.stack与queue

stack

queue

stack与queue比较

  • stack:只能尾插尾删,提供top(栈顶)
  • queue:只能头删尾插,提供front,back

list与vector比较

  • list:
  • 插入删除效率高,提供了push_back,pop_back,push_front,pop_front
  • 不支持随机访问,只有front,back

  • vector:
  • 头插头删效率低,提供了:push_back,pop_back
  •  支持随机访问,提供了[],front,back         

2.priority_queue

2.1相关介绍

1.优先级队列是一种容器适配器,它的第一个元素总是它包含元素的中最大的

2.与堆类似

3.接口功能与queue基本相同,其pop相当于弹出堆顶元素

4.其参数:

使用仿函数来决定是建立大堆小堆

1.默认情况下priority_queue是大堆,   若要建立小堆:将第三个模板参数换位greater

priority_queue<int, vector<int>, greater<int>> q;

2.如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载

2.2模拟实现priority_queue

思路:

1.选择vector容器

2.priority_queue与堆类似,相当于完全二叉树

--插入数据: 1.在尾部插入数据2.开始向上调整

--删除数据: 1.将堆顶元素与尾部元素交换 2.从堆顶开始向下调整

3.使用仿函数来改变大小堆的建立

--仿函数:

	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;}};

--push

		void push(const T& x) {//1.在尾部插入元素_con.push_back(x);	//2.向上调整(从尾部)addjust_up(size()-1);}void addjust_up(size_t child) {Cmp cmp;size_t parent = (child - 1) / 2;while (child > 0) {//孩子比父节点大,交换/*if (_con[child] > _con[parent]) */if (cmp(_con[parent] , _con[child])){swap(_con[child],_con[parent]);child = parent;parent = (child - 1) / 2;}//否则直接结束else{break;}}}

--pop

		void pop() {if (empty())return;//1.交换堆顶与尾部元素swap(_con[0],_con[size()-1]);_con.pop_back();//2.向下调整(从根)addjust_down(0);}void addjust_down(size_t parent) {Cmp cmp;size_t child = parent * 2 + 1;//2.向下调整while (child < size()) {//1.找到孩子节点较大的一个/*if (child + 1 < size() - 1 && _con[child + 1] > _con[child]) */if (child + 1 < size() - 1 && cmp(_con[child], _con[child + 1])){++child;}/*if (_con[child] > _con[parent]) */if (cmp(_con[parent], _con[child])){swap(_con[child],_con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}

--top

		//堆顶元素不可修改,改了会改变堆的性质const T& top() {return _con.front();}

--size

		size_t size() {return _con.size();}

--empty

		bool empty() {return _con.empty();}

--迭代器区间构造

		//迭代器区间构造template<class iterator>priority_queue(iterator first,iterator last) :_con(first,last){//从队列中第一个非叶子节点开始向下调整for (int num = ((size() - 1) - 1) / 2; num >= 0; num--) {addjust_down(num);}}	

效果展示:

2.3仿函数

仿函数:通常指的是可以像函数一样调用的对象

仿函数是一个类或对象,它实现函数调用运算符operate(),使你可以像调用普通函数一样使用仿函数来执行一些操作

与C语言中的回调函数功能类似,回调函数作为参数传递给另一个函数,并且可以在后者执行过程中被调用,  其通常作为函数指针或函数引用的形式

示例:

template<class T>
struct Less
{bool operator()(const T& left, const T& right){return left < right;}
};void test1()
{Less<int> cmp;cout << cmp(1, 2) << endl;
}

效果:

3.容器适配器

1.适配器定义:适配器是一种模式,该模式把类的接口转换为用户期望的另一个接口

stack和queue被成为容器适配器:这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque

stack模拟实现

	template<class T,class Container = deque<T>>class Stack {public://构造函数Stack() {}void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_back();}const T& top() {return _con.back();}const size_t size() {return _con.size();}bool empty() {return _con.empty();}private:Container _con;};

queue模拟实现

	template<class T , class container = deque<T>>class Queue {public://构造函数Queue() {}void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_front();}T& back(){return _con.back();}const T& back()const{return _con.back();}const T& front()const{return _con.front();}size_t size() const{return _con.size();}bool empty(){return _con.empty();}private:container _con;};

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

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

相关文章

PHP8中伪变量“$this->”和操作符“::”的使用-PHP8知识详解

对象不仅可以调用自己的变量和方法&#xff0c;也可以调用类中的变量和方法。PHP8通过伪变量“$this->”和操作符“::”来实现这些功能。 1.伪变量“$this->” 在通过对象名->方法调用对象的方法时&#xff0c;如果不知道对象的名称&#xff0c;而又想调用类中的方法…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Mooctest

开发者 测试框架junit 1.字符串不能除 2.a给了c 3. 4. 5.输入是否>0 6.注释

Python中的用法与常见问题解析

装饰器是Python语言中一种强大且常用的概念。通过装饰器&#xff0c;我们可以在不修改原始函数代码的情况下&#xff0c;给函数添加额外的功能&#xff0c;比如日志记录、性能分析、输入验证等。在本文中&#xff0c;我们将深入探讨Python中装饰器的用法和常见问题&#xff0c;…

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路&#xff1a; 快慢指针&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff1b; 第一次相遇时&#xff0c;假设慢指针共走了 f 步&#xff0c;则快指针走了 2f 步&#xff1b; 假设起点到环入口结点的长度为 a&#xff08;不包括入口结点…

【7.Vue 利用Heatmap.js 制作自定义热力图】

1.效果 2.背景 需要根据后端检测的设备的数值显示设备周围的清洁度,用户希望用热力图的方式来显示,于是在网上找了资料,发现可以用Heatmap.js来实现。 Heatmap.js 官网:https://www.patrick-wied.at/static/heatmapjs/ 3.引入组件 安装Heatmap.js npm install Heatmap.…

Nginx之带宽限制解读

目录 基本介绍 指令配置 limit_rate limit_rate_after 实战测试 原理&#xff1a; 令牌桶算法 基本介绍 在高负载的网络环境下&#xff0c;为了保持服务的稳定性&#xff0c;限速 (download rate) 是一种必要的操控拜访量的手法。Nginx 是一款高性能的 Web 服务器和反向代…

踩中AIGC 美图看清自己“工具”本职

日前&#xff0c;美图公司发布 2023 年中期业绩&#xff0c;实现总收入 12.61 亿元&#xff0c;同比增长 29.8%&#xff1b;实现经调整后归母净利润 1.51 亿元&#xff0c;同比增长 320.4%&#xff0c;利润增速是收入增速的十倍。同时&#xff0c;在 AIGC 的加持下&#xff0c;…

Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录 第七讲第八讲第九讲第十讲 第七讲 1、最简单的状态机-三角波发生器 1、两种状态的代码&#xff1a; //最简单的状态机&#xff0c;三角波发生器&#xff1b; timescale 1ns/10ps module tri_gen(clk,res,d_out); input clk; input res; o…

【Linux】【网络】传输层协议:TCP

文章目录 TCP 协议1. TCP 协议段格式2. TCP 报头解析3. TCP 的可靠性4. 面向字节流5. 粘包问题6. 连接队列维护 TCP 的 确认应答机制TCP 的 超时重传机制TCP 的 三次握手TCP 的 四次挥手setsockopt 函数&#xff1a;设置套接字选项&#xff0c;解决 TIME_WAIT 状态引起的 bind …

在B站上如何把已经上传的视频做成合集?

参考视频: 【在B站上如何把已经上传的视频做成合集&#xff1f;】 https://www.bilibili.com/video/BV1Uf4y1G7eR/?share_sourcecopy_web&vd_source8af85e60c2df9af1f0fd23935753a933 【B站投稿视频合集的几种方式最全攻略】 https://www.bilibili.com/video/BV1jZ4y1h7…

SpringCloud 学习(三)Ribbon 和 Feign

4. Netflix.Ribbon 4.1 简介 (1) 概念 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具。 (2) 负载均衡&#xff08;LB&#xff1a;LoadBalance&#xff09;和集群架构 应用集群&#xff1a;将同一应用部署到多台机器上&#xff0c;组成处理集群&…

Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法 安卓应用是一个客户端&#xff0c;与传统软件类似&#xff0c;需要把软件打包&#xff0c;然后通过某种渠道&#xff08;应用市场&#xff09;分发给用户&#xff0c;这是常规的发布方式&#xff0c;它的更新节奏很慢&#xff0c;从你在应用…

Docker 容器监控之CAdvisor+InfluxDB+Granfana

是什么 一句话&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 CAdvisor InfluxDB Granfana 总结 容器编排CIG CIG CAdvisorInfluxDBGranfana 1、新建目录 2、新建docker-compose.yml文件 version: 3.1volumes:grafana_data: {}services:influxdb:image: t…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[架构之路-223]:数据管理能力成熟度评估模型DCMM简介

目录 一、背景 二、评估依据 三、评估内容 四、主要适用对象 五、能力等级 六、不同层次的文件&#xff1a; 一、背景 信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通…

更适合程序员体质的PPT制作工具——Slidev

Slidev简介 Slidev是什么 Slidev是一款基于Vue.js的现代化幻灯片制作工具&#xff0c;它可以帮助用户快速、高效地制作出美观、专业的幻灯片。 目前市面上有很多功能丰富的、通用的、所见即所得的幻灯片制作工具&#xff0c;例如 微软 PowerPoint 或 苹果 Keynote. 它们在制…

tp8 Editor.md

Editor.md - 开源在线 Markdown 编辑器 放于public文件夹下 html代码&#xff1a; <div class"layui-col-md12" id"content"><textarea name"content" placeholder"详情" class"layui-textarea">{notempty nam…