《栈~~队列~~优先级队列》

news2024/10/5 21:19:03

目录

前言:

1.stack

1.stack的介绍

2.stack的使用:

3.stack的模拟实现

4.有关stack的oj笔试题

2.queue

1.队列的介绍

2.队列的使用

3.队列的模拟实现

4.有关队列的oj笔试题

3.priority_queue

1.优先级队列的介绍

2.优先级队列的使用

3.优先级队列的模拟实现

4.有关priority_queue的面试题:

总结:

############################################################################# 

致前行的人:

                要努力,但不要着急,繁花锦簇,硕果累累都需要过程!

 

#############################################################################

 

前言:

        本篇文章主要介绍STL中的stack和queue以及priority_queue的基本使用和模拟实现以及stack和queue以及priority_queue的结构在算法题中的应用。

#############################################################################

1.stack

1.stack的介绍

1.stack是一种容器适配器,数据特点是后进先出。

2.stack是作为容器适配器实现的,容器适配器是对特定类作封装作为底层实现,并提供一组特定的成员函数访问元素

3.stack的底层容器可以是任何标准的容器类模板或者是一些其它类的特定容器类,这些容器类应该支持一下操作:

~empty:判空操作        ~back:获取尾部的元素        ~push_back:尾部插入元素操作

~pop_back:尾部删除元素操作

4.标准容器vector,list.deque均符合这些需求,默认情况下没有为stack指定特定的容器,默认情况下使用的是deque.

#############################################################################

2.stack的使用:

stack()构造空的栈
empty()检测栈是否为空
size()返回栈中的元素个数
top()返回栈顶的数据
push()将元素插入栈中
pop()删除栈顶的元素

 #############################################################################

#############################################################################

3.stack的模拟实现

从栈的接口可以看出,栈其实是一种特殊的vector,因此使用vector可以完全模拟实现stack:

#include<vector>
namespace st
{
	template<class T>
	class stack
	{
	public:
		stack()
		{};
		void push(const T& val)
		{
			s.push_back(val);
		}
		void pop()
		{
			s.pop_back();
		}
		T& top()
		{
			return s.back();
		}
		size_t size() const
		{
			return s.size();
		}
		bool empty() const
		{
			return s.empty();
		}
	private:
		std::vector<T> s;
	};
}

除了可以使用vector实现之外还可以使用list和deque容器实现,所以为了使用起来方便可以在提供一个容器模板参数,这样可以任意切换。

#############################################################################

#############################################################################

4.有关stack的oj笔试题

练习题1:最小栈

 练习题二:栈的弹出和压入序列

 练习题三:逆波兰表达式求值

练习题四:用栈实现队列 

#############################################################################

#############################################################################

2.queue

1.队列的介绍

1.队列是一种容器适配器,数据满足先进先出的特点。

2.队列作为容器适配器实现,容器适配器将特定容器类封装作为其底层容器类,queue提供一组特定的成员来实现对数据的访问。

3.底层容器可以是标准容器类模板之一,也可以是专门设计的容器类,该底层容器应该至少支持以下操作:

~empty:判断队列是否为空        ~size:返回队列中有效元素的个数        ~front返回队头元素

~back:返回队尾元素        ~push_back:在队列尾部入元素        ~pop_front:删除队列头部的元素

4.标准容器类list和deque满足这些要求,默认情况下,如果没有为queue指定容器类,默认使用的是deque.

2.队列的使用

queue()构造空的队列
empty()判断队列是否为空
size()返回队列中有效元素的个数
front()返回队头的元素
back()返回队尾的元素
push()在队尾入元素
pop()队头元素出队列

############################################################################# 

#############################################################################

3.队列的模拟实现

queue的底层实现和stack一样可以使用vector和list以及deque,但是使用vector头删需要挪动数据时间复杂过高,所以一般使用list和deque,可以提供一个容器模板参数,使用时进行切换。

namespace q
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		queue()
		{};
		void push(const T& val)
		{
			_q.push_back(val);
		}
		const T& front()
		{
			return _q.front();
		}
		const T& back()
		{
			return _q.back();
		}
		void pop()
		{
			_q.pop_front();
		}
		bool empty()
		{
			return _q.empty();
		}
		size_t size()
		{
			return _q.size();
		}

	private:
		Container _q;
	};
}

 #############################################################################

#############################################################################

4.有关队列的oj笔试题

用队列实现栈

 #############################################################################

 #############################################################################

3.priority_queue

1.优先级队列的介绍

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

2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:
~empty():检测容器是否为空  ~size():返回容器中有效元素个数
~front():返回容器中第一个元素的引用  ~push_back():在容器尾部插入元素
~pop_back():删除容器尾部元素
5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。
6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、push_heap和pop_heap来自动完成此操作。

 #############################################################################

 #############################################################################

2.优先级队列的使用

priority_queue()
empty()
top()
push()
pop()

 #############################################################################

 #############################################################################

3.优先级队列的模拟实现

 

上面已经基本上模拟实现了priority_queue,但是还有一个类模板参数没有实现就是仿函数,关于仿函数这个概念是第一次接触,下面首先来介绍一下什么是仿函数:

仿函数:是一个类,需要重载一个()运算符

仿函数的用法:

举例:冒泡排序

没有使用仿函数的冒泡排序

加上仿函数模板参数:

这种泛型也被称为逻辑泛型,可以通过传递不同的仿函数对象控制逻辑

依照上面这种思路,就可以给priority_queue加上仿函数了:

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

 

 #############################################################################

 #############################################################################

4.有关priority_queue的面试题:

#############################################################################

总结:

以上就是关于stack,queue和priority_queue的结构介绍,希望能够在学习C++的路上能够帮助到你!

 

#############################################################################

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

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

相关文章

挥别2022,坦迎2023。

第一章&#xff1a;CSDN&#xff0c;我来啦&#xff01;第一节&#xff1a;初遇&#xff01;2022-08-13&#xff0c;我和CSDN相遇啦&#xff01;CSDN&#xff0c;你好呀&#xff01;2022年8月13日&#xff0c;是我与你相遇的日子。这是一个值得纪念的时刻。从此之后&#xff0c…

English Learning - L1-10 时态(下) 2023.1.5 周四

English Learning - L1-10 时态&#xff08;下&#xff09; 2023.1.5 周四8 时态8.3 完成时态核心思想&#xff1a;回首往事&#xff08;一&#xff09;现在完成时核心思想用法延续动作延续时间 “动作一直持续了。。。”延续动&#xff08;无延续时间&#xff09; “做过。。…

AtCoder Beginner Contest 284 A - E

题目地址&#xff1a;AtCoder Beginner Contest 284 - AtCoder 一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.8 Last edited: 2023.1.8 目录 题目地址&#xff1a;AtCoder Beginner C…

基于FPGA的UDP 通信(一)

引言手头的FPGA开发板上有一个千兆网口&#xff0c;最近准备做一下以太网通信的内容。本文先介绍基本的理论知识。FPGA芯片型号&#xff1a;xc7a35tfgg484-2网口芯片&#xff08;PHY&#xff09;&#xff1a;RTL8211网络接口&#xff1a;RJ45简述以太网什么以太网&#xff1f;以…

k8s之实战小栗子

写在前面 本文一起看一个基于k8s的实战小栗子&#xff0c;在这篇文章 中我们基于docker搭建了一个WordPress网站。本文就通过k8s再来实现一遍。架构图如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/9c73ac0c183a429a8f4b1a2feb363527.png 从上图可以…

使用Origin计算数据的上升\下降时间

使用Origin计算上升/下降时间计算上升时间1导入数据&#xff0c;做图2、选择合适的数据范围3、选择上升时间和上升范围两个测量参数&#xff0c;获得结果4、更改区间&#xff0c;并导出数据计算下降时间1、将感兴趣区域移动到下降沿2、更改为测量下降沿参数获得结果上升时间小工…

【Kotlin】空安全 ④ ( 手动空安全管理 | 空合并操作符 ?: | 空合并操作符与 let 函数结合使用 )

文章目录一、空合并操作符 ?:二、空合并操作符与 let 函数结合使用一、空合并操作符 ?: 空合并操作符 ?: 用法 : 表达式 A ?: 表达式 B如果 表达式 A 的值 不为 null , 则 整个表达式的值 就是 表达式 A 的值 ; 如果 表达式 A 的值 为 null , 则 整个表达式的值 就是 表达…

vue-路由的使用方式

1.下载路由 使用npm的下载: # vue2对应版本 npm i vue-router3# vue3对应版本 npm i vue-router42.路由初试化 路由的三种模式: history, 指定路由的模式, 有hash,history,memory三种模式,一般使用第一种和第三种模式 createWebHashHistory hash模式 > http://localhost…

十大字符串函数与内存操作函数

前言&#xff1a;我们知道在C语言的库中有许许多多的库函数&#xff0c;今天我就来介绍一下自己对两大类库函数中一些常用函数的认识和理解&#xff0c;希望对大家有帮助。 说明&#xff1a;下文中会花较大篇幅实现这些库函数的模拟&#xff0c;请大家不要觉得库函数直接用就好…

UNet入门总结

作者&#xff1a;AI浩 来源&#xff1a;投稿 编辑&#xff1a;学姐 Unet已经是非常老的分割模型了&#xff0c;是2015年《U-Net: Convolutional Networks for Biomedical Image Segmentation》提出的模型。 论文连接&#xff1a;https://arxiv.org/abs/1505.04597 在Unet之前…

Android 深入系统完全讲解(4)

4 SystemServer 创建过程 SystemServer 进程非常关键了&#xff0c;我们上层的服务都是在这里以线程的形式存在&#xff0c;比如 AMS&#xff0c;PMS&#xff0c;WindowManagerService&#xff0c;壁纸服务&#xff0c;而关于调试这个服务进程&#xff0c;我们随后就会讲到。 …

虚拟人-面部表情-Audio2Face语音驱动表情

任务&#xff1a; 输入自己的音频&#xff0c;导入maya模型&#xff0c;让maya模型通过音频驱动说话 教程&#xff1a; https://www.bilibili.com/video/BV1rZ4y1R7H4/?p2&spm_id_frompageDriver&vd_sourceef114f70c3fd4d5394f12dbd3d022bbe 一.下载和安装 1.首先…

Java面试常见问题-SE篇

JavaSE面试问题汇总①int和Integer的区别为什么设计封装类型&#xff1f;JDK、JRE、JVM的区别和equals方法的区别hashCode()与equals()之间的关系泛型中extends和super的区别String、StringBuffer、StringBuilder的区别重载和重写的区别接口和抽象类的区别List与Set的区别Array…

2023/1/8总结

今天学了了强连通算法 Tarjan算法 Tarjan算法是一种求解有向图强连通分量的线性时间的算法&#xff0c;他运用到了DFS算法以及DFS的特性和数据结构——栈。 算法介绍&#xff1a;如果两个顶点可以相互通达&#xff0c;则称两个顶点强连通(strongly connected)。如果有向图G…

LeetCode题解 二叉树(十三):701 二叉搜索树的插入操作;450 删除二叉搜索树中的结点

701 二叉搜索树的插入操作 medium 给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 如果要按照题目中所说改变二叉…

渗透测试中的常用编码

渗透测试中的常用编码 页面编码 在网页设置网页编码 在中加入设置特定html标签 这样页面的编码就会变成utf-8 &#xff0c;如果没有设置编码就会使用默认 的编码&#xff0c;而浏览器默认编码与之不同就会出现乱码。 常用的有三种格式分别是 utf-8、gbk、gbk2312 ascii编码…

_Linux 进程信号-信号处理篇

文章目录前言捕捉信号1. 内核如何实现信号的捕捉2. sigaction代码验证可重入函数volatile(关键字)SIGCHLD信号实验一实验二前言 信号发送 信号处理 已经讲过&#xff0c;本章讲解信号处理最后一部分。 捕捉信号 信号捕捉过程图 经过信号捕捉过程图&#xff1a;我们知道信号…

语音文件分析

语音文件格式的重要参数 语音波形,它的这个文件,主要的格式就是采样率,那么电话或者嵌入式设备,采样率一般是8000Hz,就一秒钟8000个点,如果是PC机麦克风,那是16K,就一秒钟是16000个点,像这个CD是高保真的,音乐唱片的是用这个44.1K。 量化位数,又叫采样精度,…

绿通科技在创业板通过注册:收入依赖美国市场,张志江为实控人

2023年1月6日&#xff0c;证监会发布关于同意广东绿通新能源电动车科技股份有限公司&#xff08;下称“绿通科技”或“绿通电动车”&#xff09;、杭州国泰环保科技股份有限公司首次公开发行股票注册的批复。换句话说&#xff0c;证监会同意上述两家公司的创业板IPO注册。 同日…

【手写 Vue2.x 源码】第十一篇 - Vue 的数据渲染流程

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组数据变化的观测情况&#xff0c;涉及以下几个点&#xff1a; 实现了数组数据变化被劫持后&#xff0c;已重写原型方法的具体逻辑&#xff1b;数组各种数据变化时的观测情况分析&#xff1b; 目前为止&#xff0c;数据劫持…