【C++】学习笔记——stack和queue

文章目录

  • 九、stack和queue
    • 1. stack和queue的介绍
    • 2. stack和queue的使用
    • 3. stack和queue的模拟实现
    • 4. deque的简单了解
  • 未完待续


九、stack和queue

1. stack和queue的介绍

在这里插入图片描述
在这里插入图片描述
stack 就是我们常说的 ,而 queue 就是 队列 。栈就是 后进先出 的数据结构,队列就是 先进先出 的数据结构。从严格意义上来讲,这里的栈和队列已经不属于 容器 了,而是属于 容器适配器 。什么是 容器适配器 呢,我们待会再说。

2. stack和queue的使用

stackqueue 的使用非常简单。
在这里插入图片描述
栈就这么多接口,其中绝大部分接口我们已经非常非常熟悉了。
在这里插入图片描述
队列也只有这么点接口,同样我们都非常熟悉了。
我们发现,栈和队列有一个共同点:他们都不支持迭代器 。为什么呢?因为栈和队列有自己的输入和输出规则,栈是 后进先出 ,队列是 先进先出 ,而迭代器可能会打破这个规则,所以他们俩都不支持迭代器。

#include<iostream>
#include<stack>
#include<queue>
using namespace std;

int main()
{
	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();
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

3. stack和queue的模拟实现

STL库 里,这俩其实是通过 适配器模式 实现的。适配器是什么意思呢?他就像电源转换器一样,将多少多少伏特电压转换成多少多少伏特电压。具有 转换 的功能。我们一般都是通过循序结构来实现栈和队列的,但是既然我们已经学了 vectorlist ,所以我们就能把 vectorlist 拿过来使用。

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

namespace my
{
	template<class T, class Container>
	class stack
	{
	public:
	private:
		Container _con;
	};
}

在这里,如果是数组栈,那我们第二个参数传 vector 即可,如果是链式栈,那第二个参数传 list 即可。

// 数组栈
stack<int, vector<int>>;
// 链式栈
stack<int, list<int>>;

这样实现的栈就是 适配器模式的栈 ,通过容器适配出来的栈。

所以说,我们栈所需要的函数和结果,通过调用其他容器的函数就行。我们来见证一下:首先创建一个 Stack.h 头文件。

// Stack.h
#pragma once
#include<vector>
#include<list>

namespace my
{
	template<class T, class Container>
	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;
	};
}

是不是很震惊?没错,调用其他容器的函数就能实现栈。我们来测试一下:

// test.cpp
#include<iostream>
#include"Stack.h"
using namespace std;

void test01()
{
	my::stack<int, vector<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();
	}
	cout << endl;
}

int main()
{
	test01();
	return 0;
}

在这里插入图片描述
跟我们想的栈几乎没区别好吧。仅仅只是创建对象的时候需要两个参数而已,但是 STL库 里的栈和队列就没有第二个参数,我们需要将第二个参数给优化掉。怎么优化呢? 缺省参数

// 函数模板给缺省参数就能够解决问题。
template<class T, class Container = vector<T>>
class stack
{
public:
	//
private:
	Container _con;
};

这下若是使用数组栈,就可以只传一个参数了。

#include<iostream>
#include"Stack.h"
#include<queue>
using namespace std;

void test01()
{
	my::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();
	}
	cout << endl;
}

int main()
{
	test01();
	return 0;
}

在这里插入图片描述
栈的实现这么简单,队列的实现同样非常简单,这里我直接给代码了:

#pragma once
#include<list>

namespace my2
{
	template<class T, class Container = list<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			// 尾部入队列
			_con.push_back(x);
		}

		void pop()
		{
			// 头部出队列
			_con.pop_front();
		}

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

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

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

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

测试一下:

#include<iostream>
#include"Queue.h"
using namespace std;

void test02()
{
	my2::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();
	}
	cout << endl;
}

int main()
{
	test02();
	return 0;
}

在这里插入图片描述

4. deque的简单了解

在这里插入图片描述
deque 是什么?deque双端队列 。但其本质不是队列,它并不要求先进先出。它集合了 vectorlist 的优点。
在这里插入图片描述

vector的优缺点

优点:支持下标随机访问。
缺点:头部或者中间插入/删除效率低,扩容有消耗

list的优缺点

优点:支持任意位置插入/删除,效率都不错。
缺点:不支持下标随机访问。

那我们还需要使用 vectorlist 吗?当然要使用,不然我们学他们干什么哈哈。deque 就像是一个链表,每个节点存的都是一个小数组,然后通过一个 中控指针数组 来指向每一个节点的地址,就像 页表 一样。可以快速访问数据。由于 deque 支持头插和尾插,所以 中控指针数组一开始只能在中间头插的时候中控指针数组往左延申,尾插的时候往右延申。当中控指针数组满的时候给其扩容。
由于 deque 的逻辑难度和实现难度都比之前的难不少,这里就不再详细实现,通过看文档了解即可。

deque的优缺点

优点:头插/尾插的效率很好。
缺点:中间插入会非常麻烦,效率一般,[]访问的效率不够极致。

在这里插入图片描述
在这里插入图片描述
STL库 里的栈和队列当中,默认容器都是 deque ,原因就是 deque的头尾插入删除很优秀 ,而栈和队列也仅仅支持头尾插入删除。


未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软考】设计模式之观察者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. java示例 1. 说明 1.定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。2.也称为模型-视图模式、源-收听者模式或从属者…

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

JETBRAINS IDES 分享一个2099通用试用码!WebStorm 2024 版 ,支持一键升级

文章目录 废话不多说上教程&#xff1a;&#xff08;动画教程 图文教程&#xff09;一、动画教程激活 与 升级&#xff08;至最新版本&#xff09; 二、图文教程 &#xff08;推荐&#xff09;Stage 1.下载安装 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

ChatGLM 本地部署指南(问题解决)

硬件要求&#xff08;模型推理&#xff09;&#xff1a; INT4 &#xff1a; RTX3090*1&#xff0c;显存24GB&#xff0c;内存32GB&#xff0c;系统盘200GB 如果你没有 GPU 硬件的话&#xff0c;也可以在 CPU 上进行推理&#xff0c;但是推理速度会更慢。 模型微调硬件要求更高。…

扫描工具xary

xary(被动扫描) 与bp进行联动 优点 流量小,结果精准 浏览器将流量传给bp8080端口,再从bp传给xray7777端口,最后到服务器 目的是可以从bp清晰的看到访问的流量包,发到xray后会这些流量包进行扫描,鼠标点击目标哪个功能就会进行功能点的扫描 .\xray.exe webscan --list…

从XML配置角度理解Spring AOP

1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象&#xff0c;这些代理对象包装了目标对象&#xff08;即业务组件&#xff09;&#xff0c;以便在调用目标对…

车企大佬争做IP,谁掌握了社媒流量密码?

“流量时代&#xff0c;酒好也怕巷子深。” 环顾过去的四周&#xff0c;可能是2024年以来汽车圈最热闹的时刻&#xff0c;车企掌门人轮番“卷入”直播间&#xff0c;现身车展积极互动。 我们看到了吉利董事长李书福、奇瑞汽车董事长尹同跃、长城汽车董事长魏建军、蔚来汽车创始…

idm下载到99.99%不动了 idm突然不下载了 idm下载到最后没速度咋办 IDM下载后没网了是怎么回事

idm能够帮助我们下载不同类型的网页视频&#xff0c;并且基于多线程下载技术的助力下使其下载速度比原来提升数倍以上&#xff0c;因此成为了许多朋友下载的小助手。但也有朋友反映idm下载网页视频超时连接不上&#xff0c;idm下载网页视频突然停止&#xff0c;究竟这些情况我们…

linux部署安装DataX和DataX-Web

1.基础环境 JDK&#xff08;1.8 及其以上都可以&#xff0c;推荐 1.8&#xff09;&#xff0c;安装过程略 Python&#xff08;2 或者 3 都可以&#xff09;&#xff0c;安装过程略 Apache Maven 3.6.1&#xff08;只有DataX源码编译安装时需要&#xff09; 1.1下载maven安装…

win11 安装oracle11g详细流程及问题总结

1.安装包下载地址 本案例操作系统&#xff0c; Oracle 11g下载-Oracle 11g 64位/32位下载官方版(附详细的安装图解教程) - 多多软件站多多为大家免费提供Oracle 11g下载&#xff0c;包含64位/32位官方版本&#xff0c;并附详细的Oracle 11g安装图解教程&#xff0c;同时希望能…

文本处理三剑客grep,awk,sed-读书笔记(十四)

文本处理三剑客{ 1.内容过滤器 > grep 2.文本分析器 > awk 3.行文本处理器 > sed } grep内容过滤器 grep命令是Linux系统中一个非常强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。grep全称是Global Regular Expr…

二百三十六、Kettle——修改MySQL中历史数据为当前系统日期同步到MySQL另一张表中并且每日数据逐渐减少

一、目的 由于一些雷达死了但是又需要有数据进行展示&#xff0c;于是就把这些雷达的历史数据&#xff0c;修改日期为当前日期后&#xff0c;同步到MySQL另一张表中&#xff0c;并且每日每台雷达的数据逐渐减少&#xff0c;等同于人为创建数据问题 二、实施步骤 &#xff08;…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

极狐GitLab 容器镜像安全扫描实践【下】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

element-plus的ElNotification 内容换行显示

效果图&#xff1a; 代码&#xff1a; const excelSuccess ({ data, status, message }) > {if (status 20005) {const msg message.replace(/\,/g, "<br />");//把,替换成换行符<br />ElNotification({dangerouslyUseHTMLString: true,//加此属性…

YOLOv9全网最新改进系列::YOLOv9完美融合双卷积核(DualConv)来构建轻量级深度神经网络,目标检测模型有效涨点神器!!!

YOLOv9全网最新改进系列&#xff1a;&#xff1a;YOLOv9完美融合双卷积核&#xff08;DualConv&#xff09;来构建轻量级深度神经网络,目标检测模型有效涨点神器&#xff01;&#xff01;&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er …

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…

数字人实训室助推元宇宙人才培养

如今&#xff0c;全身动作捕捉设备已经大量应用在影视、动画、游戏领域&#xff0c;在热门的元宇宙内容领域中&#xff0c;全身动作捕捉设备逐步发挥着重要的作用&#xff0c;在包括体育训练、数字娱乐虚拟偶像、虚拟主持人、非物质文化遗产保护等等场景&#xff0c;数字人实训…

【stm32HAL库】ADC多通道DMA采集

一、介绍一下HAL库函数 1.ADC 2.DMA 二、实验思路 1.根据数据手册直到PC1&#xff0c;PA2&#xff0c;PA3分别为ADC123的通道11&#xff0c;2&#xff0c;3&#xff0c;我们就用这三个通道来采集&#xff0c;每一个通道采集 50 次&#xff0c;即一共需要DMA传输150个数据 2.由…

镊子蜡烛如何抓住反转进行交易?昂首资本2步抓住反转

很多投资者通过之前的文章知道镊子烛台图&#xff0c;甚至可以通过镊子烛台图有多倍收益&#xff0c;但是很多投资者又迷惑了&#xff0c;为什么我没有通过镊子烛台图获得收益&#xff0c;甚至有时还会亏损收手。其实事情很容易理解&#xff0c;Anzo Capital昂首资本认为那是因…