栈和队列(适配器模式模拟)

news2024/11/26 14:42:08

在这里插入图片描述

文章目录

  • 声明
  • stack的介绍
  • queue的介绍
  • deque双端队列简单介绍(了解)
    • 概述
    • 优缺点
  • 适配器模式
    • 通过容器适配器模拟stack
    • 通过容器适配器模拟queue
  • 总结

声明

模拟实现源代码已上传至gitee仓库:stack_queue_learn

stack的介绍

stack文档介绍

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类
  4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

queue的介绍

queue的文档介绍

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。
  4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

deque双端队列简单介绍(了解)

概述

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

在这里插入图片描述

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维
数组:
在这里插入图片描述

如果需要尾插,就在中控数组中新开一个buffer数组,如果头插,就在中控数组前面开一个buffer数组,如果中控数组满了就扩容。

在这里插入图片描述
此时如何查找第i个值呢?

  1. 如果第一个buffer不满,i=i-第一个buffer的数据个数
  2. 如果第一个buffer满的,先找在第几个buffer中:i/N;在这个buffer中的第几个:i%N

那deque是如何借助其迭代器维护其假想连续的结构呢?
deuqe内部有两个迭代器:iterator startiterator finish
在这里插入图片描述

优缺点

与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

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

但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构


适配器模式

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
在这里插入图片描述

通过容器适配器模拟stack

#pragma once
#include<vector>
#include<list>

namespace gwj
{
	//stack<int,vector<int>> st1;
	//stack<int,list<int>> st2;

	template<class T,class Container=std::vector<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

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

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

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

	private:
		Container _con;
	};
}

Container=std::vector<T>这意味着如果用户不显式提供容器类型,将默认使用 std::vector 作为容器类型。

template<class T,class Container=std::vector<T>>: 这是一个类模板的声明,定义了一个名为 stack 的类模板。它有两个模板参数:T 表示栈中元素的类型,Container 表示用于存储栈元素的容器类型。其中 Container=std::vector<T> 是默认模板参数,如果用户不显式指定容器类型,则默认使用 std::vector

通过容器适配器模拟queue

#pragma once
#include<deque>
#include <list>
namespace gwj
{
	template<class T, class Con =std::deque<T>>
	//template<class T, class Con = list<T>>
	class queue
	{
	public:
		queue() {}
		void push(const T& x) { _c.push_back(x); }
		void pop() { _c.pop_front(); }
		T& back() { return _c.back(); }
		const T& back()const { return _c.back(); }
		T& front() { return _c.front(); }
		const T& front()const { return _c.front(); }
		size_t size()const { return _c.size(); }
		bool empty()const { return _c.empty(); }
	private:
		Con _c;
	};
}

template<class T, class Con = std::deque<T>>: 这是一个类模板的声明,定义了一个名为 queue 的类模板。它有两个模板参数:T 表示队列中元素的类型,Con 表示用于存储队列元素的容器类型。默认情况下,容器类型为 std::deque<T>,即双端队列。

总结

前面我们学习了string、vector、list现在我们来学习stack和queue时,我们会发现轻松了很多,在学习stl时,遇到不会的函数调用接口,我们直接去查阅文档即可。

在这里插入图片描述

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

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

相关文章

优思学院带你走进精益生产:现场观察(Gemba Walk)的艺术

精益生产是一种管理哲学&#xff0c;其目标是在不断提高价值的同时&#xff0c;尽可能地减少浪费和缩短交付时间。实现精益生产的关键步骤之一是现场观察&#xff08;Gemba Walk&#xff09;&#xff0c;通过现场观察&#xff0c;可以深入了解生产流程&#xff0c;发现潜在的浪…

IDM2024手机版+电脑版免费高效的下载管理工具

在数字时代&#xff0c;下载管理软件已经成为我们日常工作和生活中不可或缺的工具。随着互联网的快速发展&#xff0c;我们需要下载的文件数量和大小不断增加&#xff0c;而传统的浏览器下载方式已经无法满足我们对速度和稳定性的需求。因此&#xff0c;选择一个高效的下载管理…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十二)- 微服务(12)

目录 12.8 RestClient查询文档 12.8.1 快速入门 12.8.2 match&#xff0c; term&#xff0c;bool&#xff0c;range查询 12.8.3 排序和分页 12.8.4 高亮 12.8 RestClient查询文档 12.8.1 快速入门 Testvoid testMatchALL() throws IOException {// 1. 准备requestSearchReq…

服务器防漏扫,主机加固方案来解决

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…

推荐这3个APP,帮助你成长

扇贝阅读 当年考英语四级&#xff0c;扇贝阅读帮了很大的帮&#xff0c;这个应用我推荐给了好多同学使用&#xff0c;大家一致反馈不错。 提供很多原版的英文原著供学习&#xff0c;还自带翻译功能&#xff0c;并且提供单词本&#xff0c;遇到不懂的单词可以纪录到单词本中&am…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

Fast R-CNN 与 R-CNN的不同之处

目录 一、Fast R-CNN如何生成候选框特征矩阵 二、 关于正负样本的解释 三、训练样本的候选框 四、Fast R-CNN网络架构 4.1 分类器 4.2 边界框回归器 一、Fast R-CNN如何生成候选框特征矩阵 在R-CNN中&#xff0c;通过SS算法得到2000个候选框&#xff0c;则需要进行2000…

Vulnhub-DC-1,7

靶机IP:192.168.20.141 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 前言 1和7都是Drupal的网站&#xff0c;只写了7&#xff0c;包含1的知识点 信息收集 用nmap扫描端口及版本号 进入主页查看作者给的提示&#xff0c;不是暴力破解的…

开源大模型之辩:真假开源

目录 前言开源的定义什么是开源大模型&#xff1f;大模型时代首次出现闭源和开源“齐头并进”开源和闭源不是绝对对立的 大模型到底开源什么&#xff1f;传统开源软件与开源大模型的差别开源软件让开源大模型“受益匪浅” 不同大模型企业&#xff0c;开源、闭源策略不同开源…

机器学习——集成学习和梯度提升决策树

集成学习 不同的算法都可以对解决同一个问题&#xff0c;但是可能准确率不同&#xff0c;集成学习就是不同算法按照某种组合来解决问题&#xff0c;使得准确率提升。 那怎么组合算法呢&#xff1f; 自举聚合算法**&#xff08;bagging&#xff09;** 顾名思义是 自举聚合 自举…

1 IDA反汇编 今天只看看 别人是怎么防护的 软件安全

先看32位还是64位 能用32位的打开就是32位&#xff0c;否则会报错。API Monitor不改软件&#xff0c;只是看。 IDA加载 用的openssl加解密 定位&#xff1a;找到需要修改的地方 一般有提示句等 先看看自己写的&#xff1a;shiftF12 展示所有的字符串&#xff1b; 修改 或…

【通信原理】数字频带传输系统

二进制数字调制&#xff0c;解调原理&#xff1a;2ASK,2FSK 二进制数字调制&#xff0c;解调原理&#xff1a;2PSK,2DPSK 二进制数字已调制信号的功率谱 二进制数字调制系统的抗噪声性能 二进制调制系统的性能总结

总结之Spring AI(一)——使用Spring AI

前言 当前各种AI项目层出不穷&#xff0c;但绝大多数都是用python写的&#xff0c;现在Spring开源了Spring AI项目&#xff0c;让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1&#xff0c;支持接入openAI、Ollama、Azure openAI、Hug…

手机短信验证码登录

用户需求&#xff1a; 1、用户使用手机号和短信验证码登录系统 2、未注册过的手机号再登录时实现自动注册 3、新注册的账号只有7天的使用时间&#xff0c;过期后不允许进行登录 功能需求&#xff1a; 登录页面设计 图1.手机号登录 【验证码登录】规则说明&#xff1a; 1…

【three.js】设置three.js全屏展示,并解决大小动态变化

目录 一、设置全屏 二、canvas画布宽高度动态变化 一、设置全屏 这个很简单,直接用代码读取当前全屏需要的长宽即可。 const width = window.innerWidth; //窗口文档显示区的宽度作为画布宽度 const height = window.innerHeight; //窗口文档显示区的高度作为画布高度 二、…

水帘降温水温

不同环境下的水帘啊&#xff0c;使用水温是不一样的&#xff0c;夏天使用水疗的水有两种&#xff0c;一个是常温的循环水&#xff0c;20~26左右&#xff0c;另外一个呢&#xff0c;就是深井水&#xff0c;重点是啥呢&#xff1f;就是无论我们用哪一种&#xff0c;能够把温度降到…

计算机网络(4) 最长前缀匹配(路由转发表)

一.路由转发 网络数据包IP段只包含源地址与目的地址&#xff0c;经过数据链路层包装与物理层信号形式转换&#xff0c;最终经由不同的链路节点到达目的地址。这个过程是一步一步&#xff08;hop by hop&#xff09;进行的&#xff0c;路过一个路由节点则称为一跳。每个路由节点…

绘唐一键追爆款3正式版

【绘唐2一键追爆款】 这是一个关于追求梦想的故事&#xff0c;讲述了一个普通人如何利用一键追爆款的技巧&#xff0c;成功打造自己的事业的动人故事。 主人公小明是一个市井小民&#xff0c;生活过得平凡无奇。他一直怀揣着一个梦想&#xff0c;希望能够通过自己的努力&#x…

Stable Diffusion: ControlNet Openpose

上一文已经介绍了ControlNet的安装&#xff0c;点击右边的三角箭头。 拖放原始姿态图片。 勾选“启用”&#xff0c;“完美像素模式”&#xff0c;“允许预览” 控制类型选择“OpenPose(姿态&#xff09;” 预处理器选“openpose_full”&#xff0c;会对原始姿态图片做整体分…

【C++】编译

三、C编译 前面给大家演示了如何从写C代码到编译代码再到执行代码的全过程。这个过程中非常重要的编译环节&#xff0c;被我们一个按钮或者一个ctrlF7快捷键就给带过了。其实这个环节非常重要&#xff0c;如果你非常了解这个环节&#xff0c;你开发源代码就会更加自信和清醒&a…