C++: stack 与 queue

news2024/10/5 18:27:12

目录

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.coloradmin.cn/o/1040392.html

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

相关文章

Toaster - Android 吐司框架,专治 Toast 各种疑难杂症

官网 https://github.com/getActivity/Toaster 这可能是性能优、使用简单&#xff0c;支持自定义&#xff0c;不需要通知栏权限的吐司 想了解实现原理的可以点击此链接查看&#xff1a;Toaster 源码 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下&#xff0c;需要在 bui…

如何使用Docker安装最新版本的Redis并设置远程访问(含免费可视化工具)

文章目录 安装Docker安装Redisredis.conf文件远程访问Redis免费可视化工具相关链接Docker是一种开源的应用容器引擎,使用Docker可以让我们快速部署应用环境,本文介绍如何使用Docker安装最新版本的Redis。 安装Docker 首先需要安装Docker,具体的安装方法可以参考Docker官方文…

用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC

文章目录 用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC1. 用友U8 crm客户关系管理简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC 免责声明&#xff1a;请勿利用文章内的相关…

知识图谱(5)知识表示

基于Node2Vec补全KG 知识图谱属于异质图&#xff0c;图谱包含三个元素&#xff1a;实体&#xff08;图中的节点&#xff09;&#xff0c;类型&#xff08;节点的标识&#xff09;&#xff0c;关系&#xff08;边的标识&#xff09;。KG就是把所有不同种类的信息连接在一起而得…

第1篇 目标检测概述 —(2)目标检测算法介绍

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测算法是一种计算机视觉算法&#xff0c;用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法&#xff08;如Haar特征和HOG特征&#xff09;以及基于深度学习的方法&#xff0…

C语言指针笔试题讲解

大家好&#xff0c;我们来学习一些C语言的指针笔试题。对于C语言指针的模块想必大家都非常的头疼吧&#xff0c;那么我们就来就来看看一些关于C语言指针的笔试题。 首先让我们看到我们今天的第一题。 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1)…

AUTOSAR RTE介绍(更新版230925)

RTE是什么 AUTOSAR RTE(Run Time Environment)实现了AUTOSAR系统中的虚拟功能总线(VFB),提供了SWC(Software Component)之间的访问接口和SWC对于BSW资源的访问接口。RTE为SWC中的Runnable提供与其他SWC或者BSW模块通信的接口,RTE将Runnable映射到OS Task中,并且管理Runna…

二进制中1的个数 C++实现

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; const int N100010; int a[N]; int n;int lowbit(int x){return x & -x; }int main(){scanf("%d",&n);for(int i0;i<n;i) scanf("%d",&a[i]);for(int i…

抽检监测实施

声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则&#xff0c;监测准备、监测实施、监测效果评价 与反馈等过程指导…

this.$nextTick()的使用场景

事件循环机制&#xff1a; 同步代码执行->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环1]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环2]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nex…

Win10专业版系统一键重装怎么操作?

Win10专业版系统一键重装怎么操作&#xff1f;与传统的系统重装相比&#xff0c;一键重装不仅省去了繁琐的安装步骤&#xff0c;这一简单操作使得系统维护和恢复变得更加便捷&#xff0c;让用户不再为系统问题而烦恼。下面小编给大家详细介绍关于一键重装Win10专业版系统的操作…

使用bash脚本编译Qt工程

最近在搭建Qt工程的编译服务器&#xff0c;需要通过shell脚本执行工程的编译过程&#xff0c;写在这里&#xff0c;总结最近的工作。 1. 构建过程 以Windows为例&#xff0c;在QtCreator中左侧选择“项目”便可以看到编译的指令和参数&#xff0c;这些操作也会在我们点击“构建…

个人博客系统测试报告(一)

作者&#xff1a;爱塔居 专栏&#xff1a;测试 目录 一、项目背景介绍 二、项目功能 三、测试计划 3.1自动化测试用例 3.2 性能测试 ​​​​​​​&#xff08;未完&#xff09; 一、项目背景介绍 个人博客系统前端由注册页、登录页、列表页、详情页、编辑页、个人博客列…

CompletableFuture-通用异步编程

演示Completable接口完全可以代替Future接口&#xff1a; CompletableFuture减少阻塞和轮询&#xff0c;可以传入回调对象&#xff0c;当异步任务完成或者发生异常时&#xff0c;自动 调用回调对象的回调方法。 package com.nanjing.gulimall.zhouyimo.test;import java.util…

postman接口自动化测试框架实战

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用…

Linux死锁

第三种情况 #include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h>pthread_mutex_t mutex1, mutex2; void * workA(void * arg) {pthread_mutex_lock(&mutex1);sleep(1);pthread_mutex_lock(&mutex2);printf("w…

【MySQL】 Java的JDBC编程

文章目录 &#x1f332;数据库编程的必备条件&#x1f38b;Java的数据库编程&#xff1a;JDBC&#x1f38d;JDBC工作原理&#x1f333;建立数据库连接&#x1f4cc;在项目中新建一个包&#xff0c;名字自命名&#x1f4cc;将依赖包导入新建包中&#x1f4cc;DataSource&#xf…

EPLAN_002#常用功能(二)

一、快速添加端子 端子编号 端子定义 批量修改时&#xff0c;当名称出现冲突时&#xff0c;勾选上 端子排排序&#xff0c;可以基于页 二、多层端子的快速建立 有购物车的代表一个端子 三、手动鞍型跳线 标题 四、购物车图标 在导航器中&#xff0c;有购物车是陷进去的表示 在图…

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

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

Springboot: Spring Cloud Gateway 使用的基本概念及配置介绍

1. SpringCloud 与 SpringBoot的版本映射关系 在已有的Spring Boot项目中增加Spring Cloud&#xff0c;首先要确定使用的Spring Cloud的版本&#xff0c;这取决于项目使用的Spring Boot的版本 SpringCloud 与 SpringBoot的版本映射关系 如果两者的版本不兼容&#xff0c;再会…