C++初阶--stack和queue

news2024/11/22 5:52:34

目录

stack介绍

stack的使用

stack的模拟实现

queue的介绍

queue的使用

queue的模拟实现

deque

priority_queue

priority_queue的使用

仿函数

priority_queue的模拟实现


stack介绍:

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

 stack的使用:

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

stack的模拟实现:

//适配器模式
namespace qwe
{
	//stack<int, vector<int>> s;
	//stack<int, list<int>> s;

	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		bool empty() const
		{
			return _con.empty();
		}

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

		const T& top() const
		{
			return _con.back();
		}

		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}
	private:
		//vector<T> _v;
		Container _con;
	};

	void test_stack()
	{
		//后进先出--不支持迭代器
		stack<int> s;

		s.push(1);
		s.push(2);
		s.push(3);
		s.push(400);

		while (!s.empty())
		{
			cout << s.top() << " ";
			s.pop();
		}
		cout << endl;
	}
}

queue的介绍:

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

 queue的使用:

queue()构造空的队列
empty()检测队列是否为空
size()返回队列中元素个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头的元素出队列

queue的模拟实现:

namespace qwe
{
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		bool empty() const
		{
			return _con.empty();
		}

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

		const T& front() const
		{
			return _con.front();
		}

		const T& back() const
		{
			return _con.back();
		}

		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

	private:
		Container _con;
	};

	void test_queue()
	{
		//queue<int, vector<int>> q; 
		//queue<int, list<int>> q;
		queue<int> q;
		q.push(10);
		q.push(20);
		q.push(30);
		q.push(40);

		while (!q.empty())
		{
			cout << q.front() << " ";
			q.pop();
		}
		cout << endl;
	}
}

deque:

双端队列,融合vector和list优点。

vector优点:下标随机访问,尾插尾删效率高,cup高速缓存命中高。

vector缺点:扩容(效率、空间浪费)、不适合头插头删。

list优点:按需申请释放空间,任意位置O(1)插入删除。

list缺点:不支持随机访问。

deque:适合头尾的插入删除

如果stack用vector默认适配:

deque优势:扩容代价不大,不需要拷贝数据,浪费空间不多。

如果stack用list默认适配:

deque优势:cpu高速cache命中。不会频繁申请小块空间。申请和释放空间次数少代价低。

如果queue用list默认适配:

deque优势:cpu高速cache命中。不会频繁申请小块空间。申请和释放空间次数少代价低。

priority_queue:

        优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

 priority_queue的使用:

priority_queue() / priority_queue(first,last)构造
empty()检测是否为空
top()
返回优先级队列中最大(最小元素),即堆顶元素
push(x)
在优先级队列中插入元素x
pop()
删除优先级队列中最大(最小)元素,即堆顶元素

默认情况下priority_queue是大堆

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

仿函数:

struct Less
{
	bool operator()(int x, int y)
	{
		return x < y;
    }
};

struct Greater
{
	bool operator()(int x, int y)
	{
		return x > y;
	}
};

int main()
{
	// Less->仿函数类型 less就叫函数对象
	Less less;
	cout << less(1, 2) << endl;

	Greater gt;
	cout << gt.operator()(1, 2) << endl;
	cout << gt(1, 2) << endl;

	Less<int> lessi;
	cout << lessi(1, 2) << endl;
	cout << Less<int>()(1, 2) << endl;
	cout << Less<double>()(1.1, 2.2) << endl;

	return 0;
}

priority_queue的模拟实现:

namespace qwe
{
	template<class T>
	struct Less
	{
		bool operator()(const T& x, const T& y) const
		{
			return x < y;
		}
	};

	//特化
	template<>
	struct Less<Date*>
	{
		bool operator()(Date* x, Date* y)const
		{
			return *x < *y;
		}
	};

	template<class T>
	struct Greater
	{
		bool operator()(const T& x, const T& y) const
		{
			return x > y;
		}
	};

	//大的优先级高--大堆
	template<class T, class Container = vector<T>, class Compare = Less<T>>

	class priority_queue
	{
	private:
		void adjust_up(size_t child)
		{
			Compare com;
			size_t parent = (child - 1) / 2;
			while (child > 0)
			{
				//if (_con[child] > _con[parent])
				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

		void adjust_down(size_t parent)
		{
			Compare com;

			size_t child = (parent * 2) + 1;
			while (child < _con.size())
			{
				//if (child + 1 < _con.size() && _con[child + 1] > _con[child])
				if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					++child;
				}

				//if (_con[child] > _con[parent])
				if (com(_con[parent], _con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}

	public:
		priority_queue()
		{}

		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
			:_con(first, last)
		{
			//建堆
			for (int i = (_con.size() - 1 - 1) / 2; i >= 0; --i)
			{
				adjust_down(i);
			}
		}

		void push(const T& x)
		{
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}

		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

		const T& top()
		{
			return _con[0];
		}

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

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

	private:
		Container _con;
	};

	void test_priority_queue()
	{
		// 默认是大的优先级高 -- 默认给的仿函数是less
		//priority_queue<int> pq;

		// 控制小的优先级高 -- 给一个greater的仿函数
		//priority_queue<int, deque<int>, Greater<int>> pq;
		priority_queue<int, deque<int>, greater<int>> pq;

		pq.push(3);
		pq.push(3);
		pq.push(7);
		pq.push(1);
		pq.push(9);

		while (!pq.empty())
		{
			cout << pq.top() << " ";
			pq.pop();
		}
		cout << endl;
	}

}

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

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

相关文章

Nginx使用(三)配置实例

一、反向代理示例一效果&#xff1a;打开浏览器&#xff0c;在浏览器地址栏输入地址www.123.com&#xff0c;跳转到linux系统tomcat主页面中具体实现&#xff1a;&#xff08;1&#xff09; 准备&#xff1a;安装nginx在linux系统安装tomcat,使用默认端口8080解压之后进入到tom…

一篇文章读懂mybatis-plus原理和CRUD接口

Myabtis-Plus配置 MybatisPlus官网 官方文档上有详细的spring boot配置mybatis-plus的教程&#xff0c;此处就不在详细赘述。 mybatis-plus是基于spring完成的只能再spring相关应用上实现。 引入父工程 注意mybatis-plus和spring boot的版本匹配不然会出现 推荐版本 <pa…

自媒体神器 Previs Shot 使用指南

Previs Shot 是一款影视创作的项目管理工具&#xff0c;更高效的方式开始您的影视创作历程。分镜表分镜表可高效绘制画面、编写景别、运镜、内容、台词等&#xff0c;甚至可以填写摄影器材、灯光等信息。分镜结构场景&#xff1a;电影里比如过生日、开party都是不同的场景&…

【程序员陪你过大年】html+css+js 实现动态新年烟花特效及服务器部署

前言 不知不觉又到了年底&#xff0c;这一年是值得庆贺的一年&#xff0c;疫情过去&#xff0c;经济好转。我们急需在春节这个特殊的日志释放下自己的情绪。但是大部分地区都不让放炮&#xff0c;于是乎我为大家带来一套十分炫酷应景的春节烟花动画代码实现。效果如下图所示 :…

【如何在Linux下使用Git命令在Gitee上创建项目】

目录 1 创建仓库 2 Git提交三板斧 2.1 add 2.2 commit 2.3 push 1 创建仓库 首先我们可以使用命令&#xff1a;git --version 来查看是否下在了git,没有下载的可以使用下面的命令安装&#xff1a; sudo yum install -y git 成功后就可以查看了&#xff1a; [grmVM-8-12-…

深度学习目标检测_YOLOV3超详细解读

文章目录YOLO V3概述网络结构backbone&#xff1a;darknet-53特征细化&#xff08;多scale&#xff09;残差连接残差网络的发家史先验框softmax改进YOLO V3概述 yolo v3论文地址&#xff1a;https://pjreddie.com/media/files/papers/YOLOv3.pdf 先说说yolo v3的效果&#xff…

字节青训营Go语言学习第二天-Go语言进阶与依赖管理

文章目录并行VS并发GoroutineCSPChannel并发安全LockWithGroupGo依赖管理GoPathGo VendorGo Module依赖分发-回源并行VS并发 并发指的是多线程在一个CPU上运行&#xff0c;而并行是直利用多核来实现多线程。 内核是系统里比较昂贵的系统资源&#xff0c;它的创建、切换停止都是…

K8s可视化界面Kubernetes DashboardKuboard

目录一、简介二、Kubernetes Dashboard2.1 部署dashboard2.2 访问UI2.3 创建访问账号三、Kuboard3.1 部署2.2 访问UI一、简介 本文给大家介绍两个K8s集群的可视化工具 Kubernetes Dashboard 和 Kuboard 二、Kubernetes Dashboard 2.1 部署dashboard dashboard Github地址&a…

【算法基础(2)】二分查找和斐波那契数列

二分查找 二分查找高效的前提是数据结构是有序的 思路&#xff1a; 1.排序 2.将数组折半&#xff0c;分成左右两个数组。 3.判断要查找的数和中间位置数值的大小&#xff0c;来判断要查找的数实在哪一半。 4.之后继续折半查找&#xff0c;直至找到这个数。 图解&#xff1a; 首…

SpringMVC看这一篇文章就够了

第一章 SpringMVC的简介 Spring框架版本 4.3.29.RELEASE SpringMVC是什么 1 2 3 4 5 61. Spring家族的一个部分 2. 是JavaWeb三层架构中控制器层的解决方案 3. 是基于MVC思想的框架-- Model-- View-- ControllerSpringMVC知识点大纲SpringMVC功能简述 1 2 3 4 5 6 7 8 9 101. 作…

WEB前端有必要学会docker吗?0基础-45分钟带你学会(包含视频笔记案例源代码)

文章目录一、为什么要使用docker二、Windows10/11系统安装Docker Desktop三、如何判断电脑已经安装好docker四、docker前端应用实战&#xff1a;将vue项目打包为docker镜像运行1、将vue的项目进行构建&#xff0c;输出dist2、准备镜像内容3、制作镜像4、启动镜像五、如何发布镜…

【Leetcode】面试题 01.02. 判定是否互为字符重排、面试题 01.04. 回文排列

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 面试题 01.02. 判定是否互为字符重排 面试题 01.04. 回文排列 面试题 …

水果店做微信活动推荐_分享水果店微信小程序制作步骤

试试做个小程序拯救你的店&#xff01;让你做出有效果的活动&#xff0c;每笔钱都花在刀刃上&#xff01;编辑第一&#xff0c;提升水果销量&#xff0c;降低损耗用水果店小程序做拼团、砍价、秒杀活动&#xff0c;并讲原本卖不完的水果&#xff0c;做成果盘吸引客人注册会员。…

点成分享|关于Grant水浴的一些FAQ

1、关于稳定性和均匀性 1&#xff09;稳定性&#xff0c;是水浴中任何一点在达到恒温时不同时间下的温度规律性波动程度的描述&#xff0c;是通过浴槽中心点测定的&#xff0c;并表示为测量值的正负一半。系同点不同时的温度特性描述。 例如&#xff1a;SAP恒温水浴设定温度为…

unreal engine建模模式建模研究

Create PolyExt 挤出(需要闭合) image.pngPathExt 具有宽度挤出 (无需闭合) 如下图绘制一个形状后按鼠标左键确定绘制完成再移动鼠标控制厚度按鼠标左键确定后端后再移动鼠标确定高度 image.pngimage.pngPathRev Draw and revolve polypaths to create new objects 画和旋转pol…

企业级监控项目Skywalking详细介绍,来看看呀

一. Skywalking概述一个优秀的项目&#xff0c;除了具有高拓展的架构、高性能的方案、高质量的代码之外&#xff0c;还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多&#xff0c;Skywalking除了提供多维度、多粒度的监控之外&#xff0c;也提供了良好的图形…

Kotlin 元编程之 KSP 全面突破

什么是元编程 没想到吧&#xff0c;这世上除了元宇宙&#xff0c;还有元编程&#xff0c;如果没有接触过&#xff0c;可能会有点懵&#xff0c;不过没关系&#xff0c;简单的说就是用代码来生成代码。实现元编程的传统常见手段主要是使用 APT注解处理器 JavaPoet 组合拳&…

JAVA基础知识巩固训练

目录 1. 案例一&#xff1a;逢 7 跳过 2. 案例二&#xff1a;数组元素求和 3. 案例三&#xff1a;判断两个数组是否相同⭐ 4. 案例四&#xff1a;查找元素在数组中的索引 5. 案例五&#xff1a;数组元素反转 6. 案例六&#xff1a;评委打分 7. 案例七&#xff1a;随机产…

后端人眼中的Vue(五)

七、Vue生命周期 ​ Vue的生命周期指的是Vue实例在页面中创建到销毁整个过程。Vue提供了在各个生命周期的钩子&#xff0c;钩子也叫Vue生命周期函数。这些生命周期函数是伴随着Vue实例创建、销毁的过程中自动触发的&#xff08;不需要人为手动触发&#xff09;。Vue实例生命周期…

产业互联网:补齐互联网的「短板」,重启互联网的「进化」

尽管在互联网时代出现了诸多的乱象&#xff0c;但是&#xff0c;我们依然无法否认互联网时代给人们的生产和生活带来的影响和改变。即使如此&#xff0c;我们依然无法否认互联网本身其实是存在着诸多的问题和弊病的&#xff0c;这些问题和弊病所导致的一个最为直接的结果&#…