C++【STL】之stack和queue学习

news2024/11/24 22:30:51

文章目录:

  • 1. 容器适配器
    • 1.1 适配器的概念
    • 1.2 STL标准库中stack和queue的底层结构
  • 2. 栈stack
    • 2.1 stack的使用
    • 2.2 stack模拟实现
  • 3. 队列queue
    • 3.1 queue的使用
    • 3.2 queue模拟实现

1. 容器适配器

1.1 适配器的概念

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

类似于以上图片中的电源转换插头,可以将用两脚插头来适配使用三角插头,它就起到了适配器的用。

1.2 STL标准库中stack和queue的底层结构

虽然stackqueue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stackqueue只是对其他容器的接口进行了包装,STLstackqueue默认使用deque,比如:

2. 栈stack

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入弹出。

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

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作
  1. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

2.1 stack的使用

栈有两个模板参数,第一个参数T表示栈中保存的元素类型,也就是底层容器的元素类型;第二个参数Container表示实现栈时所使用的底层容器,这里缺省为双端队列deque

int main()
{
	//设置底层容器
	stack<int> s1;	//默认为deque
	stack<int, vector<int>> s2;	//指定为vector
	stack<char, list<char>> s3;	//指定为list

	//查看类型
	cout << typeid(s1).name() << endl;	
	cout << typeid(s2).name() << endl;
	cout << typeid(s3).name() << endl;

	return 0;
}

下面我们来讲解一下stack常用接口的使用,有兴趣的大佬们可以前往官方文档(点击跳转)进一步了解

  • empty()接口:判空
  • size()接口:查看大小
  • top()接口:查看栈顶元素
  • push()接口:入栈
  • pop()接口:出栈
int main()
{
	stack<int> s;	//构造栈对象

	cout << "empty(): " << s.empty() << endl; 
	cout << "size(): " << s.size() << endl;
	cout << "-------------------" << endl;

	s.push(4); 	//入栈操作
	s.push(1);
	s.push(2);
	cout << "empty(): " << s.empty() << endl; //判空
	cout << "size(): " << s.size() << endl; //查看大小
	cout << "top(): " << s.top() << endl; //查看栈顶元素
	cout << "-------------------" << endl;

	s.pop(); //出栈操作
	s.pop();
	cout << "empty(): " << s.empty() << endl;
	cout << "size(): " << s.size() << endl;
	cout << "top(): " << s.top() << endl;
	cout << "-------------------" << endl;

	return 0;
}

2.2 stack模拟实现

容器适配器在模拟实现时,需要借助其他容器的接口复用,这里以使用 vector为例

namespace Sakura
{
	//模板参数2底层容器的缺省值设为vector
	template<class T, class Container = vector<int>>
	class stack
	{
	public:
		//默认构造函数不接受传参,需要提供一个带缺省参数的构造函数
		stack(const Container& c = Container())
			:_c(c)
		{}

		bool empty() const
		{
			return _c.empty();
		}

		size_t size() const
		{
			return _c.size();
		}

		T& top()
		{
			return _c.back();
		}

		const T& top() const
		{
			return _c.back();
		}

		void push(const T& val)
		{
			_c.push_back(val);
		}

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

	private:
		Container _c;
	};
}

3. 队列queue

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

  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

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

  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列
  1. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

3.1 queue的使用

队列有两个模板参数,第一个参数T表示队列中保存的元素类型,也就是底层容器的元素类型;第二个参数Container表示实现队列时所使用的底层容器,这里缺省为双端队列deque

int main()
{
	//设置底层容器
	queue<int> q1;	//默认使用deque
	queue<double, vector<double>> q2;	//指定为vector
	queue<char, list<char>> q3;	//指定为list

	//查看类型
	cout << typeid(q1).name() << endl;	
	cout << typeid(q2).name() << endl;
	cout << typeid(q3).name() << endl;

	return 0;
}

下面我们来讲解一下queue常用接口的使用,有兴趣的大佬们可以前往官方文档(点击跳转)进一步了解

  • empty()接口:判空
  • size():查看大小
  • front():查看对头元素
  • back():查看队尾元素
  • push():入队
  • pop():出队
int main()
{
	queue<int> q;	//构造出队列对象

	cout << "empty(): " << q.empty() << endl;
	cout << "size(): " << q.size() << endl;
	cout << "-------------------" << endl;

	q.push(1); //入队操作
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);
	q.push(6);
	cout << "empty(): " << q.empty() << endl; //判空
	cout << "size(): " << q.size() << endl;   //查看大小
	cout << "front(): " << q.front() << endl; //查看队头元素
	cout << "back(): " << q.back() << endl;   //查看队尾元素
	cout << "-------------------" << endl;

	q.pop(); //出队操作
	q.pop();
	q.pop();
	cout << "empty(): " << q.empty() << endl;
	cout << "size(): " << q.size() << endl;
	cout << "front(): " << q.front() << endl;
	cout << "back(): " << q.back() << endl;
	cout << "-------------------" << endl;

	return 0;
}

3.2 queue模拟实现

这里借用list作为底层容器来实现队列

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

namespace Sakura
{
    //模板参数2底层容器的缺省值设为list
	template<class T, class Container = list<T>>
	class queue
	{
	public:
		queue(const Container& c = Container())
			:_c(c)
		{}

		bool empty() const
		{
			return _c.empty();
		}

		size_t size() const
		{
			return _c.size();
		}

		T& front()
		{
			return _c.front();
		}
		const T& front() const
		{
			return _c.front();
		}

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

		void push(const T& val)
		{
			_c.push_back(val);
		}

		void pop()
		{
			_c.pop_front();
		}

	private:
		Container _c;
	};
}

C++【STL】之stack和queue学习,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正!

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

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

相关文章

Elasticsearch“滚动查询“(Scrolling)的机制的与Java使用ES Client 调用滚动查询

Elasticsearch"滚动查询"&#xff08;Scrolling&#xff09;的机制的与Java使用ES Client 调用滚动查询 前言1. 滚动查询的一般步骤1.1 发起初始搜索请求,返回命中结果和滚动ID1.2 使用滚动ID检索下一页结果1.4 重复执行直到没有检索结果返回1.5 清除滚动上下文释放资…

【系统开发】尚硅谷 - 谷粒商城项目笔记(八):Seata分布式事务

文章目录 Seata分布式事务简介事务的隔离级别事务传播行为本地事务[Transactional](https://so.csdn.net/so/search?qTransactional&spm1001.2101.3001.7020)传播行为分布式事务CAP理论分布式事务常见解决方案2PC(两阶段提交&#xff0c;刚性事务)TCC&#xff08;柔性事务…

头一次见单例模式讲的如此透彻

简介 单例模式是一种常用的软件设计模式&#xff0c;用于创建类型。通过单例模式的方法创建的类在当前进程中只有一个实例。单例模式的类只能允许一个实例存在。单例模式的作用是保证在整个应用程序的生命周期中&#xff0c;任何一个时刻&#xff0c;单例类的实例都只存在一个…

【springboot整合】Spring缓存抽象

JSR-107简介 为了统一缓存开发规范&#xff0c;以及提升缓存开发的扩展性&#xff0c;J2EE发布了JSR-107缓存开发规范。 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider、CacheManger、Cache、Entry和Expiry CachingProvider&#xff1a;定义了创建、配置…

基于Java毕业论文管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Redis【入门篇】---- Redis常见命令

Redis【入门篇】---- Redis常见命令 1. Redis数据结构介绍2. Redis 通用命令3. Redis命令-String命令4. Redis命令-Key的层级结构5. Redis命令-Hash命令6. Redis命令-List命令7. Redis命令-Set命令8. Redis命令-SortedSet类型 1. Redis数据结构介绍 Redis是一个key-value的数据…

调查问卷Type Form的集成

简介 Typeform是一家制作线上调查问卷的公司。 Muoz 和 David Okuniev两人于2012年创作出一个更加动态、更具交互性的用户调查工具&#xff0c;每次只提一个问题&#xff0c;并且根据用户的回答为其呈现下一个问题&#xff0c;像和朋友间的对话一样&#xff0c;让用户在不知不…

边缘计算开源平台

边缘计算 文章目录 边缘计算前言01 边缘计算开源平台概述02 面向物联网端的边缘计算开源平台2.1 EdgeXFoundry2.2 ApacheEdgent 03 面向边缘云的边缘计算开源平台3.1 CORD3.2 Akraino EdgeStack 04 面向云边融合的边缘计算开源平台05 构建边缘计算平台的开源软件06 结束语 前言…

类皮肤全属性凝胶电子皮肤

目前电子皮肤相关工作仅①提升单一或几个刺激感知属性&#xff08;压力、温度等&#xff09;&#xff1b;②研究部分理化属性和感知属性的结合。但这些工作仅覆盖皮肤的两种或三种属性&#xff0c;距离实现皮肤般丰富的刺激感知感官和理化特性还有很大差距。而覆盖人类皮肤的所…

linux-virtualbox安装centOS7.9

一、windows10安装virtualbox 安装包->右键->以管理员身份运行->下一步 ->选择安装位置->下一步 ->是&#xff08;网络中断&#xff1f;&#xff09; ->是&#xff08;安装一些辅助工具包&#xff09; ->安装 ->完成 二、virtualbox新建centOS7.9虚…

【Python 基础篇】Python 文件操作

文章目录 导言一、文件操作的作用二、文件的基本操作1、打开文件2、读写文件① 读取文件② 写入文件 3、关闭文件 三、文件备份四、文件和文件夹的操作结语 导言 在编程领域中&#xff0c;文件操作是一项基础且常见的任务。无论是读取配置文件、处理数据文件&#xff0c;还是备…

MySQL保姆安装教程

文章目录 前言一、MySQL官网二、离线安装包步骤三、环境配置四、验证安装是否成功在这里插入图片描述 五、可视化工具连接总结 前言 对于第一次安装mysql是有点难度&#xff0c;现在我会把安装流程搞出来。 一、MySQL官网 MySQL Installer 8.0.33安装&#xff08;不想安装这个…

Windows下redis的安装与使用

一、下载 redis.io 官网没有Windows版本的&#xff0c;需要去redis-windows下载。 二、使用与配置 2.1 解压安装 redis的Windows版本&#xff0c;有.msi和.zip两种格式。这里使用更为方便&#xff0c;直接解压就可以使用的.zip格式。 将Redis-x64-5.0.14.1.zip解压至D盘的…

【Java-SpringBoot+Vue+MySql】Day3.3-MybatisPlus说明与使用

目录 一、MybatisPlus快速入门 1、知识轰炸 2、实操演练 &#xff08;1&#xff09;新建项目 &#xff08;2&#xff09;添加依赖 &#xff08;3&#xff09;添加配置 &#xff08;4&#xff09;添加映射层 &#xff08;5&#xff09;启动类中添加注解 &#xff08;6&a…

【通过Data Studio连接openGauss】---快速入门

【通过Data Studio连接openGauss】---快速入门 &#x1f53b; 一、访问openGauss&#x1f530; 1.1 确认连接信息&#xff08;单节点&#xff09;&#x1f530; 1.2 使用gsql访问openGauss&#xff08;本地连接数据库&#xff09;&#x1f530; 1.3 使用gsql访问openGauss&…

玩机搞机------安卓手机分区操作中的的各种工具 提取分区 备份分区 檫除分区 推荐一

喜欢玩机搞机的朋友们经常对手机系统进行安装玩机操作。但有时候指令类输入和操作步骤比较繁琐。耽误时间。有些工具就比较方便操作。陆续会整理一些玩机搞机中的简单工具给爱好者使用。本期整理一些关于手机分区的工具推荐 &#x1f494;&#x1f494;&#x1f494; AB AVB分…

Android的详细介绍

目录&#xff1a; Android诞生 Android系统架构 Android系统版本 Android应用开发特色 Android诞生 2003年10月&#xff0c;Andy Rubin等人创建了Android公司&#xff0c;并组建了Android团队。 2005年8月17日&#xff0c;Google低调收购了成立仅22个月的高科技企…

【新星计划·2023】Linux目录结构

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解Linux目录结构与功能&#xff0c;以及目录解释&#xff0c;最近这段时间会持续更新关于Linux的基础知识&#xff0c;期待你的…

机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。 文章目录 一、图像梯度相关算子的原理1. Sobel算子2. Prewitt算子3. Roberts算子 二、python和halcon算子实现1.python实现2.halcon实现 基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。 梯度 1是图像中像素灰度值变化最快的…

macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.7 (21G651) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…