C++ Stack&queue&deque

news2024/11/23 12:10:27

C++ Stack&queue&deque

在这里插入图片描述

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容主要讲解了栈和队列以及deque的相关介绍和使用

文章目录

  • C++ Stack&queue&deque
    • 1.1 stack的介绍
    • 1.2 stack的使用
    • 1.3 stack的模拟实现
    • 1.4 stack相关的一些oj
    • 2.1 queue介绍
    • 2.2 queue的使用
    • 2.3 queue的模拟实现
  • 3.deque的介绍
    • 3.1duque的原理介绍
    • 3.2 deque的缺陷
    • 3.3 为什么选择deque作为stack和queue的底层默认容器

1.1 stack的介绍

官方文档介绍stack

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

元素的插入与提取操作

② stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定

的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出

③stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下

操作:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

④标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,

默认情况下使用deque(一种将list和vector结合起来的容器)。

在这里插入图片描述

1.2 stack的使用

函数说明接口说明
stack()构造一个空的栈
empty()判断stack是否为空
size()返回stack中元素的个数
top()返回stack的栈顶元素
push()将元素val压入stack中
pop()将栈顶的元素val出栈

1.3 stack的模拟实现

🔔 对于栈的模拟实现,我们阅读文档知道stack是不同于之前学习的vector和list是采用一种适配器的设计模式。至于如何通俗的理解适配器设计模式,我们日常生活中使用的充电器其实也被称为适配器的一种,所以stack的这种适配器设计模式可以认为是利用已有的容器来设计一种可以适用于我们需求的容器。

🔔 以下是stack的模拟实现,对于stack来说官方的源代码底层采用的是deque来实现的,deque也是一种采用了适配器设计模式的容器,后面会有所介绍。

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

namespace xupt
{

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



	void stack_test1()
	{
		stack<int> st;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		st.push(5);

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

1.4 stack相关的一些oj

155. 最小栈 - 力扣(LeetCode)

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

150. 逆波兰表达式求值 - 力扣(LeetCode)

232. 用栈实现队列 - 力扣(LeetCode)

2.1 queue介绍

queue的官方文档

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

提取元素。

② 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的

成员函数来访问其元素。元素从队尾入队列,从队头出队列

③底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操

作:

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列

④ 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标

准容器deque。

2.2 queue的使用

queue()构造一个空的queue
empty()判断队列内是否为空
size()返回队列中的元素个数
front()返回队头的元素
back()返回队尾的元素
push()向队列中插入新的元素
pop()删除队列中的下一个元素

2.3 queue的模拟实现

因为queue的接口中存在头删和尾插,因此使用vector来封装效率太低,故可以借助list来模拟实现queue,

具体如下:

#pragma once

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

namespace xupt
{

	template<class T, class Container = deque<int>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		const T& front()
		{
			return _con.front();
		}
		const T& back()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};

	void queue_test1()
	{
		queue<int> q;
		q.push(1);
		q.push(2);
		q.push(3);
		q.push(4);
		q.push(5);

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


}

3.deque的介绍

3.1duque的原理介绍

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

在这里插入图片描述

实际上deque并不是一段连续的空间,它实际上的结构如下图所示:

在这里插入图片描述

那么为了维护deque看似连续的结构,以及随机访问的特性,deque的迭代器设计有些复杂如下图所示:

我们可以看到deque的迭代器中有四个参数分别是cur,first,last,node.

其中:

  • cur指向的是当前的数据的位置。
  • first指向的当前buffer的首位地址。
  • last指向的当前buffer的最后一个元素的地址。
  • node指向的中控器中的存贮当前buffer的地址的位置。

在这里插入图片描述

deque::begin() 传回迭代器 start,deque::end() 传回迭代器finish。这两个迭代器都是 deque 的 data members。

3.2 deque的缺陷

与vector比较,deque是具有优势的,头插和尾插的时候不需要挪动元素,效率非常的高。另外一点是扩容的的优势,它的扩容的开销相对于vector来说也是具有优势的,也不需要搬运全部的元素。

与list比较,底层是一个相对连续的空间,空间的利用率高,不需要存储额外的字段。

看起来似乎deque结合了两者的优点,那么它有什么缺点呢?

🔔 deque不适合去遍历,因为它的迭代器相对来说比较复杂,因为deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下。

3.3 为什么选择deque作为stack和queue的底层默认容器

  • stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

  • 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

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

相关文章

如何在华为OD机试中获得满分?Java实现【字符串通配符】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

Rust 笔记:Rust 语言中应用正则表达式

Rust 笔记 Rust 语言中应用正则表达式 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明 可以让控制器内部的逻辑只执行一次&#xff1b;单次的范围是针对某…

Spring Authorization Server 系列(一)环境搭建

Spring Authorization Server 中的scope参数解析 前提依赖版本问题确定Spring Boot 版本确定 Spring Authorization Server 版本最终的依赖 第一个 Spring Authorization Server Demo 前提 由于 Spring 最新的 OAuth2 解决方案 已经由 Spring Security 下的 OAuth2 模块独立出…

从零开始学习JavaScript:轻松掌握编程语言的核心技能①

从零开始学习JavaScript&#xff1a;轻松掌握编程语言的核心技能 一&#xff0c;JavaScript 简介为什么学习 JavaScript?JavaScript 用法 二&#xff0c;JavaScript 输出JavaScript 显示数据JavaScript&#xff1a;直接写入 HTML 输出流 三&#xff0c;JavaScript 语法JavaScr…

VS2022发布独立部署的.net程序

.net core支持依赖框架部署和独立部署两种方式&#xff0c;之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例&#xff0c;VS2022中默认编译的是依赖框架部署方式&#xff08;编译的结果如下图所示&#xff09;…

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略

Android进阶 View事件体系&#xff08;三&#xff09;&#xff1a;典型的滑动冲突情况和解决策略 内容概要 本篇文章为总结View事件体系的第三篇文章&#xff0c;前两篇文章的在这里&#xff1a; Android进阶 View事件体系&#xff08;一&#xff09;&#xff1a;概要介绍和实…

Oracle——数据操纵DML(一)

STU1 1、不指定字段的整行插入 在STU1中新增一名同学的基本信息&#xff0c;SQL如下&#xff1a; INSERT INTO test.stu1 VALUES(0001,牛牛,男,24,to_date(1988-05-25,YYYY-MM-DD),12外语)格式如下&#xff1a; INSERT INTO 表名 VALUES(值1,值2,...,值n)对于CHAR或VARCHAR等…

sql-labs SQL注入平台——第二关Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入) 一、先确认漏洞是否存在 &#xff08;1&#xff09;查询 id1返回查询结果正常 &#xff08;2&#xff09;查询 id1’返回查询结果报错&#xff0c;可能存在SQL注入 &#xff08;3&#xff09;查询 id1 …

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于帝国主义竞争优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于帝国主义竞争优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用…

Dubbo环境搭建

1.搭建zookeeper注册中心环境 zookeeper下载地址 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ptMw7rb-1685261782669)(b894c0cbb6501ca97145d3b09685ae8f.png)] 在bin文件下&#xff0c;启动zkServer.cmd会有报错&#xff0c;处理需要在condi…

你所不知道的 数据在内存中储存 的来龙去脉

那么好了好了&#xff0c;宝子们&#xff0c;今天给大家介绍一下 “数据在内存中储存” 的来龙去脉&#xff0c;来吧&#xff0c;开始整活&#xff01;⛳️ 一、数据类型的介绍 &#xff08;1&#xff09;整型和浮点型&#xff1a; &#xff08;2&#xff09;其他类型…

Linux——使用命令行参数管理环境变量

目录 使用命令行参数获取用户在DOS命令行输入的指令&#xff1a; 方法&#xff1a;代码如下&#xff1a; 使用命令行参数获取并打印部分或者整体环境变量的方法&#xff1a; 方法1&#xff1a; 运行结果&#xff1a; 方法2&#xff1a;使用外部链接environ: 使用命令行参数…

如何开发背包系统?

UE5 插件开发指南 前言0 背包数据结构1 背包管理组件2 背包UI显示前言 相信大家对于背包系统并不陌生,谁还没有玩过几款游戏呢?游戏中的背包都是大同小异的,朴素的功能就是存放我们获取到的物品,高级一点就是要有物品分类,便于玩家刷选背包中的物品,能够显示玩家拥有的货…

2023 牛津大学博士后申请指南

牛津大学是全球著名的高等教育机构&#xff0c;其博士后项目备受瞩目。为了帮助申请者更好地了解牛津大学博士后申请流程&#xff0c;本文将介绍该校博士后申请指南的相关内容。一、申请条件首先&#xff0c;申请者必须已经获得博士学位或即将完成博士学位&#xff0c;并具有相…

《数据库应用系统实践》------ 报刊销售系统

系列文章 《数据库应用系统实践》------ 报刊销售系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#xff…

k8s 对已完成job自动清理

job在处理完一个任务以后&#xff0c;状态会变成Completed&#xff0c;job在状态为Completed的时候默认不会自动清理的&#xff0c;还会继续占用系统资源。 TTL-after-finished控制器 kubernetes中有专门的控制器可以自动清理已完成的job,就是TTL-after-finished控制器。 TTL…

数据中心产业如何变革?中国数字能源生态大会这些观点值得一读

对于数据中心产业&#xff0c;这是一个最好的时代。数字经济的蓬勃发展&#xff0c;推动产业数字化、企业数字化转型步入纵深阶段&#xff0c;大幅增加数据中心等基础设施的需求&#xff0c;让数据中心产业迎来前所未有的市场良机。 与此同时&#xff0c;对于数据中心产业&…

【备战秋招】每日一题:4月1日美团春招(二批)第一题:题面+题目思路 + C++/python/js/Go/java带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…