stack - queue - priority_queue

news2025/1/15 8:37:32

1.stack和queue的使用

2.底层逻辑

2.1  stack和queue都是容器适配器,是用其他容器适配形成的

stack的逻辑是后进先出的逻辑,意味着会发生尾差和尾删,其容器就可以选择是vector和list

queue的逻辑是先进先出,意味着会发生头删和尾插,考虑到vector头插头删的效率低,其可使用list作为容器。

2.2 deque(双端队列)

实际上stack和queue使用的是deque(双端序列)容器进行存储数据。下面我们来介绍deque

deque支持常数时间的头插头删尾插尾删也支持随机访问 

 可谓是集vctor和list的优点于一身,但是缺点是随机访问和迭代器遍历的效率低。主要是因为他的底层结构

可见其底层结构是多个连续小段数组组成,并有映射中控数组map对这些分开的小数组调控。在map开始储存数据时是在中间端存储数据。但是在迭代器和随机访问时就涉及到通过中控计算出具体位置,因此效率低。但是在stack和queue并不需要随机访问和迭代器遍历,因此可以很好的用到deque的优点,避免了其缺点。

3.priority_queue(优先队列)

prioritty_queue也是容器适配器,其默认是用vector<int>进行适配。其默认是大堆,即排列顺序是从大到小,但是我们也可以用greater<T>仿函数,使其从小到到排序。

其底层的逻辑是利用了堆排序,每次push数据时利用adjustup排序数组,出数据时先交换头和尾数据,再尾删,再利用adjustdow排序数组,每次的时间复杂度都是O(logN)。

#pragma once
#include<iostream>
#include <vector>
#include<algorithm>
using namespace std;

namespace claus
{
		using namespace std;

		template<class T>
		struct less
		{
			bool operator()(const T& x1, const T& x2)
			{
				return x1 < x2;
			}
		};
		template<class T>
		struct greater
		{
			bool operator()(const T& x1, const T& x2)
			{
				return x1 > x2;
			}
		};

		template<class T, class Container = vector<T>, class Compare = less<T> >
		class priority_queue
		{
		public:
			void adjustup()
			{
				int child = size() - 1;
				int parent = (child - 1) / 2;
				while (child > 0)
				{
					if (Compare()(_con[parent] , _con[child]))
					{
						swap(_con[child], _con[parent]);
						child = parent;
						parent = (parent - 1) / 2;
					}
					else
					{
						break;
					}
				}
			}
			void adjustdow()
			{
				int parent = 0;
				int child = parent * 2 + 1;
				while (child < size())
				{
					if (child + 1 < size() && Compare()(_con[child], _con[child + 1]))
					{
						child++;
					}

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

			void push(const T& val) // 默认是大堆,因此需要用adjustup算法
			{
				_con.push_back(val);
				adjustup();
			}

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

			bool empty()
			{
				return _con.empty();
			}
			size_t size()
			{
				return _con.size();
			}
			const T& top()
			{
				return _con.front();
			}
		private:
			Container _con;
		};

}

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

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

相关文章

Codigger Keyboard Look应用说明

Keyboard Look是一项专为Desktop设计的功能模式&#xff0c;旨在通过全面启用键盘操作&#xff0c;减少对鼠标依赖&#xff0c;从而提升用户的工作效率和操作体验。尤其对于频繁使用键盘的用户&#xff0c;如开发者&#xff0c;此模式可显著加速日常操作&#xff0c;优化工作流…

[NewStar 2024] week2

Crypto 第2周的密码依然都是签到题 这是几次方&#xff1f; 疑惑&#xff01; 给了个提示&#xff1a;hint p^e 10086 这里边不要当成乘幂&#xff0c;而且加法的优先级高于异或&#xff0c;所以phint ^ (e10086)得到p就能正常解RSA了 Since you konw something 给的c是…

HTML5实现古典音乐网站源码模板2

文章目录 1.设计来源1.1 主界面1.2 古典音乐界面1.3 著名人物界面1.4 古典乐器界面1.5 历史起源界面1.6 联系我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&a…

PostGIS:公交站点覆盖率分析

现有公共交通规划中常以“公交站点覆盖率”来评价公共交通服务覆盖情况,该指标通常用来评估公共交通服务的普及程度和便利性。以下,我们将基于PostGIS实现公交站点覆盖率分析。 1.公交站点覆盖率 公交站点覆盖率,也称公交站点服务面积率,是公交站点服务面积占城市用地总面…

gaussdb 主备 8 数据库安全学习

1 用户及权限 1.1 默认权限机制-未开启三权分立 1.1.1 数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后&#xff0c;默认只有对象所有者或者系统管理员可以查询、修改和销毁对象&#xff0c;以及通过GRANT将对象的权限授予其他用户。 1.1.2 GaussDB支持以下的…

DS1302时钟芯片+esp8266 / spi 学习 arduino

DS1302时钟芯片esp8266 这个芯片往上能找到很多资料,这里主要记录我手里的模块, 看了下芯片资料,说是当vcc 供电小于备用时用备用电源 这里直接没有接vcc 遇到的问题 1.esp8266复位短路导致串口断开: 当只接scl sda rst 三个引脚的时候 esp8266复位会 导致短路,也有可能…

★ C++进阶篇 ★ AVL树实现

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第五章----AVL树实现 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️澄岚主页&#xff1a;椎名澄嵐-CSDN博客C专栏&#xff1a;★ C进阶篇 ★_椎名澄嵐的博客-CSDN博客 ❄️…

QT工程概述

在Qt中&#xff0c;创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围&#xff1a; MainWindow&#xff1a;这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序&#xff0c;需要这些额外的用户…

Java | Leetcode Java题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; class Solution {public int largestPalindrome(int n) {if (n 1) {return 9;}int upper (int) Math.pow(10, n) - 1;int ans 0;for (int left upper; ans 0; --left) { // 枚举回文数的左半部分long p left;for (int x left; x >…

uni-app关闭底部系统导航栏的控制按钮BUG

描述 plus.navigator.hideSystemNavigation(); 在uni-app中使用 plus.navigator.hideSystemNavigation(); 关闭导航栏时会出bug会留下一个黑框。这个bug基于手机&#xff1b; 平板的性能来决定出bug频率原因是&#xff1a;过早启用霸屏导致的&#xff08;过早使用plus.navig…

执行vue create XXX报错The operation was rejected by your operating system

创建项目&#xff1a; vue create my-project 报错&#xff1a; npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\Program Files\nodejs\node_cache\_cacache\tmp\5d2a6f8e npm ERR! errno -4048 npm ERR! Error: EPERM: operation not permitted, open D:\Pro…

18933 括号匹配问题

### 思路 1. **输入处理**&#xff1a;读取输入的字符串。 2. **匹配括号**&#xff1a;使用栈来匹配括号&#xff0c;记录无法匹配的左括号和右括号的位置。 3. **标注输出**&#xff1a;根据记录的位置&#xff0c;生成标注字符串&#xff0c;输出原始字符串和标注字符串。 …

车辆损伤评估数据集(提供分割和检测两种标注方式)6类4000张高分辨率图共9000余标注,6GB数据量

车辆损伤评估数据集&#xff08;提供分割和检测两种标注方式&#xff09; 标注类型包括 dent: 凹痕 scratch: 划痕 crack: 裂缝 glass shatter: 玻璃破碎 tire flat: 轮胎扁平 lamp broken: 车灯损坏 4000张高分辨率图共9000余标注&#xff0c;6GB数据量 车辆损伤评估数据集介…

复合泊松过程

复合泊松过程的均值、方差与特征函数 复合泊松过程的定义 复合泊松过程 ( Y(t) ) 是一种常见的随机过程&#xff0c;通常定义为&#xff1a; Y ( t ) ∑ k 1 N ( t ) X k Y(t) \sum_{k1}^{N(t)} X_k Y(t)k1∑N(t)​Xk​ 其中&#xff1a; ( N(t) ) 是一个强度为 ( \lambd…

IP地址与CDN提升网络速度

视频流媒体、在线游戏、或是电商购物&#xff0c;互联网在我们的工作生活中愈加不可或缺&#xff0c;人们对于网络的加载速度要求也越来越严苛。而IP地址与CDN的协同工作&#xff0c;对于互联网速度增加与稳定起这重大的作用。 一、CDN的工作原理 CDN是由分布在全球各地的服务…

P1439 【模板】最长公共子序列 Python 题解

【模板】最长公共子序列 题目描述 给出 1 , 2 , … , n 1,2,\ldots,n 1,2,…,n 的两个排列 P 1 P_1 P1​ 和 P 2 P_2 P2​ &#xff0c;求它们的最长公共子序列。 输入格式 第一行是一个数 n n n。 接下来两行&#xff0c;每行为 n n n 个数&#xff0c;为自然数 1 …

Shell脚本:分发文件到各个集群节点

找一个全局目录/root/bin 写脚本 touch xsync chmod 777 xsync #!/bin/bash#作者&#xff1a;ldj #时间&#xff1a;2024-10-15 #描述&#xff1a;拷贝文件#1. 判断参数个数 if [ $# -lt 1 ]thenecho "Error: Not Enough Argument!"exit fi#2.遍历集群所有机器 spac…

工业和建筑工地 安全帽-安全带识别数据集 yolo数据集 共2200张 已增强 标注

安全帽-安全带识别数据集 yolo数据集 共2200张 已增强 安全帽检测与安全带识别数据集 图像数量&#xff1a;2,200张增强后标注数量&#xff1a; belt&#xff08;安全带&#xff09;&#xff1a;3,197个head&#xff08;头部&#xff09;&#xff1a;326个helmet&#xff08;安…

asp.net Core 自定义中间件

内联中间件 中间件转移到类中 推荐中间件通过IApplicationBuilder 公开中间件 使用扩展方法 调用中间件 含有依赖项的 》》》中间件 参考资料

数据结构——排序(1)

数据结构——排序(1) 文章目录 数据结构——排序(1)一、排序1.概念&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 2.运用&#xff1a;购物筛选排序&#xff0c;院校排名等。 3.常见排…