【c++丨STL】stack和queue的使用及模拟实现

news2025/1/13 13:37:22
🌟🌟作者主页:ephemerals__
🌟🌟所属专栏:C++、STL

目录

前言

一、什么是容器适配器

二、stack的使用及模拟实现

1. stack的使用

empty

size

top

push和pop

swap

2. stack的模拟实现

三、queue的使用及模拟实现

1. queue的使用

empty

size

front和back

push和pop

swap

2. queue的模拟实现

总结


前言

        本篇文章,博主将介绍STL中两个比较重要的容器适配器stack(栈)queue(队列)以及它们的使用方法,并且尝试模拟实现它们。如果你不是很了解栈和队列这两种数据结构,可以参阅这篇文章:

【数据结构】栈和队列(c语言实现)(附源码)_创建栈和队列及使用代码-CSDN博客

正文开始

一、什么是容器适配器

        与vector、list这些容器不同,stack和queue被称作容器适配器。所谓容器适配器,就是指在一种已有的容器基础上,为其添加了一些新的特性或者功能,目的是使一事物的行为类似于另一类事物。

        比如说栈这一数据结构,它的本质其实就是对顺序表或者链表的功能进行了一些限制,例如无法遍历、只能在一端进出数据等,但其底层仍然是顺序结构或是链式结构。STL在设计stackqueue时,并没有从零开始构建它们的底层结构,而是采用了这种设计思想,对现有容器进行了封装,从而实现了它们。

        接下来,我们看看SGI版本的STL源码是怎么实现stack的:

可以看到,源码使用了一个叫做deque的容器创建对象,然后调用该对象的一些接口来实现stack的接口。之后模拟实现stack和queue的过程中,我们也将遵循源码的设计思路,对其他容器(例如vector和list)进行封装。

关于deque(双端队列)的底层结构,博主将在后续文章中讲解。

二、stack的使用及模拟实现

        接下来,我们正式开始学习stack的使用方法,并尝试模拟实现。

1. stack的使用

        stack的成员函数如下:

注意:容器适配器是不支持遍历的,所以它们没有迭代器接口。 

empty

empty的作用是判断栈是否为空,若为空则返回true,否则返回false。 

代码示例:

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

int main()
{
	stack<int> s1;
	stack<int> s2;

	s2.push(1);//压入一个元素

	cout << s1.empty() << endl;
	cout << s2.empty() << endl;
	return 0;
}

size

size用于获取栈中元素个数

代码示例:

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

int main()
{
	stack<int> s;

	s.push(1);
	s.push(1);
	s.push(1);

	cout << s.size() << endl;
	return 0;
}

top

top用于获取栈顶元素。 代码示例:

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

int main()
{
	stack<int> s;

	s.push(10);

	cout << s.top() << endl;
	return 0;
}

push和pop

push的功能是将数据压入栈顶,而pop可以将栈顶元素弹出

使用举例:

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

int main()
{
	stack<int> s;
	
	for (int i = 1; i <= 10; i++)//循环压入十个元素
	{
		s.push(i);
	}

	while (!s.empty())//栈非空则循环出栈
	{
		cout << s.top() << ' ';
		s.pop();//出栈
	}
	return 0;
}

swap

swap用于交换两个栈的内容。 

2. stack的模拟实现

        stack的模拟实现也比较简单,由于我们之前使用顺序结构来实现栈,那么我们就将vector作为封装容器。代码如下:

#include <iostream>
#include <vector>
using namespace std;

template<class T, class Container = vector<T>>//模板参数默认为vector
class Stack
{
public:
	//压栈
	void push(const T& x)
	{
		_con.push_back(x);//调用vector的尾插
	}

	//出栈
	void pop()
	{
		_con.pop_back();//调用vector的尾删
	}

	//取栈顶元素
	const T& top() const
	{
		return _con.back();//调用vector的获取尾元素
	}

	//判空
	bool empty() const
	{
		return _con.empty();//调用vector的empty
	}

	//获取元素个数
	size_t size() const
	{
		return _con.size();//调用vector的size
	}

	//交换
	void swap(Stack<T>& s)
	{
		_con.swap(s._con);//调用vector的交换函数
	}
private:
	Container _con;//成员容器
};

三、queue的使用及模拟实现

        在掌握了stack的使用与模拟实现之后,我们为大家介绍queue的使用及模拟实现。

1. queue的使用

        queue的成员函数如下:

empty

empty用于判断队列是否为空。若为空则返回true,否则返回flase。

代码示例:

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

int main()
{
	queue<int> q1;
	queue<int> q2;

	q1.push(1);

	cout << q1.empty() << endl;
	cout << q2.empty() << endl;
	return 0;
}

size

size用于获取队列中的元素个数。代码示例:

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

int main()
{
	queue<int> q;
	q.push(1);
	q.push(1);
	q.push(1);
	q.push(1);
	q.push(1);

	cout << q.size() << endl;
	return 0;
}

front和back

frontback分别用于获取对头/队尾元素。代码示例:

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

int main()
{
	queue<int> q;

	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);

	cout << q.front() << endl;
	cout << q.back() << endl;
	return 0;
}

push和pop

pushpop分别用于进行入队/出队操作注意对头出队,队尾入队

代码示例:

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

int main()
{
	queue<int> q;

	for (int i = 1; i <= 10; i++)
	{
		q.push(i);
	}

	while (!q.empty())
	{
		cout << q.front() << ' ';
		q.pop();
	}
	return 0;
}

swap

swap用于交换两个队列的内容

2. queue的模拟实现

        接下来,我们尝试模拟实现queue。由于list具有头删和尾插的接口,我们就将list作为封装容器。代码实现如下:

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

template<class T, class Container = list<T>>//模板参数默认为list
class Queue
{
public:
	//入队
	void push(const T& x)
	{
		_con.push_back(x);//调用list的尾插
	}

	//出队
	void pop()
	{
		_con.pop_front();//调用list的头删
	}

	//取队头元素
	const T& front()
	{
		return _con.front();//调用list的front
	}

	//取队尾元素
	const T& back()
	{
		return _con.back();//调用list的back
	}

	//获取元素个数
	size_t size()
	{
		return _con.size();//调用list的size
	}

	//判空
	bool empty()
	{
		return _con.empty();//调用list的empty
	}

	//交换
	void swap(Queue<T>& q)
	{
		_con.swap(q._con);//交换两个成员容器的内容
	}
private:
	Container _con;//成员容器
};

总结

        今天我们学习了STL两个适配器:stack和queue的使用及模拟实现。不难发现,容器适配器的实现思路显著提高了正确率和代码复用率。 如果你觉得博主讲的还不错,就请留下一个小小的赞在走哦,感谢大家的支持❤❤❤

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

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

相关文章

MyBatis-Plus分页插件IPage用法

首先就是service接口需要继承IService<entity> 然后就是业务类实现类中需要继承ServiceImpl<Mapper,entity> Mapper正常写法&#xff0c;继承baseMapepr<entity> IPage的使用方式 QueryWrapper<MdSaleDayPhone> queryWrappernew QueryWrapper<>…

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…

Android Studio 设置不显示 build-tool 无法下载

2024版本查看build-tool版本 File -> Settings -> Languages & Frameworks -> Android SDK 或者直接打开Settings后搜索“SDK” 解决方案 将 Android Studio 升级到2022.2.1以上的版本将 C:/Windows/System32/drivers/etc/hosts 文件用管理员身份打开&#xff0c…

【JavaSE】【网络编程】UDP数据报套接字编程

目录 一、网络编程简介二、Socket套接字三、TCP/UDP简介3.1 有连接 vs 无连接3.2 可靠传输 vs 不可靠传输3.3 面向字节流 vs 面向数据报3.4 双向工 vs 单行工 四、UDP数据报套接字编程4.1 API介绍4.1.1 DatagramSocket类4.1.1.1 构造方法4.1.1.2 主要方法 4.1.2 DatagramPocket…

MFC图形函数学习10——画颜色填充矩形函数

一、介绍绘制颜色填充矩形函数 前面介绍的几个绘图函数填充颜色都需要专门定义画刷&#xff0c;今天介绍的这个函数可以直接绘制出带有填充色的矩形。 原型1&#xff1a;void FillSolidRect(int x,int y,int cx,int cy,COLORREF color); 参数&#xff1a;&a…

macOS 无法安装第三方app,启用任何来源的方法

升级新版本 MacOS 后&#xff0c;安装下载的软件时&#xff0c;不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal)&#xff1a; 打开终端后&#xff0c;输入以下代码回车&#xff1a; …

基于“开源 2+1 链动模式 S2B2C 商城小程序”的社区团购运作主体特征分析

摘要&#xff1a;本文聚焦社区团购运作主体&#xff0c;深入探讨便利连锁店型与社会力量型运作主体在社区团购中的特点&#xff0c;并结合“开源 21 链动模式 S2B2C 商城小程序”&#xff0c;分析其对社区团购的影响与作用机制&#xff0c;旨在为社区团购的进一步发展与优化提供…

Properties文件:Properties属性文件键值对的获取方法、如何写入信息到Properties属性文件、Properties对象的用法

目录 1、什么是Properties文件&#xff1f;和普通txt文件有什么区别&#xff1f; 2、读写Properties文件 2.1 代码演示-读取属性文件 2.2、代码演示-把键值对的数据写入到属性文件中去 1、什么是Properties文件&#xff1f;和普通txt文件有什么区别&#xff1f; 我们都知道…

枫清科技亮相 2024 中国 5G+工业互联网大会,推动 AI 赋能新型工业化

11 月 19 日&#xff0c;2024 中国 5G工业互联网大会在武汉盛大开幕&#xff0c;吸引了来自国内外的行业专家与领先企业。本次大会以“实数融合 智造翘楚”为主题&#xff0c;重点围绕 5G 与工业互联网的深度融合应用、人工智能、智能网联汽车等领域展开讨论与成果展示。作为行…

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

使用Python编写脚本,为Excel表格添加水印

简介 这是本人实习中的一个小任务&#xff0c;经过无数努力&#xff0c;终于搞出来了。网上很多资料和博客都是lese&#xff0c;完全没有理清楚水印在excel中的定义是什么&#xff0c;插个图片就是水印吗&#xff1f;当然不是&#xff01;如果帮助到佬们请点个赞吧。 Ecxel中…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…

jspm东风锻造有限公司重大停管理系统

摘要 东风锻造有限公司重大停管理系统提供给员工和经理一个重大停信息管理的系统。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员&#xff0c;员工和经理三个部分&#xff0c;系统管理员主要功能包括个人中心…

list =和addAll在List<实体类>数组的应用

实体类 A public class A {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;} }用会报错 publi…

探索设计模式:原型模式

设计模式之原型模式 &#x1f9d0;1. 概念&#x1f3af;2. 原型模式的作用&#x1f4e6;3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 &#x1f4f0; 4. 应用场景&#x1f50d;5. 深拷贝和浅拷贝 在面向对象编程中&#xff0c;设计模式是一种通用的解决方案…

多目标优化算法:多目标极光优化算法(MOPLO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、极光优化算法 极光优化算法&#xff08;Polar Lights Optimization, PLO&#xff09;是2024年提出的一种新型的元启发式优化算法&#xff0c;它从极光这一自然现象中汲取灵感。极光是由太阳风中的带电粒子在地球磁场的作用下&#xff0c;与地球大气层中的气体分子碰撞而产…

FPGA实现PCIE3.0视频采集转SFP光口千兆UDP网络输出,基于XDMA+GTH架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我已有的PCIE方案1G/2.5G Ethernet Subsystem实现物理层方案1G/2.5G Ethernet PCS/PMA or SGMII Tri Mode Ethernet MAC实现物理层方案本博客方案的PCIE2.0版本 3、P…

40分钟学 Go 语言高并发:开发环境搭建与工程化实践

Day 01 - Go开发环境搭建与工程化实践 1. Go环境变量配置 1.1 重要的环境变量表格 环境变量说明示例值GOROOTGo语言安装根目录Windows: C:\goLinux/Mac: /usr/local/goGOPATH工作目录&#xff0c;包含src、pkg、binWindows: C:\Users\username\goLinux/Mac: ~/goGOBIN可执行…

【Mysql】函数-----窗口函数

1、介绍 Mysql 8.0 新增了窗口函数&#xff0c;窗口函数又被称为开窗函数&#xff0c;与orcale窗口函数相似&#xff0c;属于Mysql的一大特点。非聚合函数是相对于聚合函数来说的。聚合函数是一组数据计算后返回单个值&#xff08;即分组&#xff09;。非聚合函数一次只会处理…

【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)

本文项目编号 T 039 &#xff0c;文末自助获取源码 \color{red}{T039&#xff0c;文末自助获取源码} T039&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…