C++之栈和队列使用及模拟实现

news2024/9/23 11:27:43

目录

栈的使用

 队列的使用

栈的模拟实现 

队列的模拟实现

deuqe容器介绍


在C语言中我们已经学习了栈和队列的相关性质,今天我们主要来学习C++语法中栈和队列的相关概念。

栈的使用

在C++中栈是一种容器适配器,在其内部适配了其它的容器,其相关接口使用适配的容器的相关接口进行实现。什么是适配器呢?下面我们模拟实现的时候会讲述。

栈的主要接口有:push(),pop(),top(),size(),empty().

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


int main()
{
	stack<int> s;
//1.往栈中入数据
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
//2.求栈顶的元素
	cout<<s.top()<<endl;
//3.删除栈顶的元素
	s.pop();
//4.判断栈顶是否为空
	while (!s.empty())
	{
		cout << s.top() << " ";
		s.pop();
	}
	cout << endl;
//5.求栈中元素的个数
	cout << s.size() << endl;

	return 0;
}

 队列的使用

队列和栈一样,也是一个容器适配器。

队列的主要接口有:push(),pop(),front(),back(),size(),empty().

int main()
{
	queue<int> q;
//向队列中入元素
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
//获取队列头的数据
	cout << q.front() << endl;
//获取队列尾的数据
	cout << q.back() << endl;
//判断队列是否为空,删除队列头部的数据
	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	} 
	cout << endl;
//获取队列的元素的个数
	cout << q.size() << endl;
	return 0;
}

栈的模拟实现 

上面我们提到了栈是一种容器适配器,下来我们详细讲解一下什么是容器适配器。 我们之前学习过,栈可以是数组栈,也可以是链式栈。所以按照这个思路而言,栈的数据结构中我们完全可以采用vector数组或者list链表作为底层的容器去进行数据的存储以及接口的封装。但是有没有一种方法可以使底层容器既可以是链表也可以是数组呢。这个问题其实就回到了我们之前学习的模板的概念,因为一个模板在实例化时可以被转化为多种类型。所以这个容器适配器本质上其实也是一种模板,不过这个模板一般在实例化时都会被实例化成stl中的容器类型,比如vector,list,string,deque,forward_list等等。stl库中一般采用deque这个双端队列容器,至于为什么,下面我们讲deque时会为大家讲解。

代码如下。

#pragma once
#pragma once
#include<deque>
using namespace std;
namespace yjd
{
	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		//push
		void push(const T& x)
		{
			_con.push_back(x);
		}

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

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

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

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

	private:
		Container _con;
	};



}

队列的模拟实现

#pragma once
#include<deque>
using namespace std;
namespace yjd
{
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		//push
		void push(const T& x)
		{
			_con.push_back(x);
		}

		//pop
		void pop()
		{
			_con.pop_front();
		}

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

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

		//front
		const T& front() const
		{
			return _con.front();
		}

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



}

总的来说,栈和队列的实现都是采用deque容器存储数据,并封装deque的接口成了stack和queue对应的的接口,为什么使用deque容器,下来为大家解释。 

deuqe容器介绍

上文说道,stack和queue的容器适配器中我们选择了deque这个容器进行适配,为什么要选择这个容器适配呢?list和vector一样也支持对应的接口,为什么不去使用list和vector这两个容器呢?先来回忆一下vector和list的优缺点。

vector优点:底层物理空间是连续的,所以支持下标随机访问,cpu高速缓存命中率高。高速缓存命中率就是,cpu在访问数据时所需的数据已经加载到高速缓存中的比率。cpu在访问数据时,会先将数据加载到高速缓存中然后再进行访问。因为vector底层是连续的,所以加载第一个元素数据时,会顺便将后面的元素数据全部加载到高速缓存中,所以它的高速缓存命中率高。

vector缺点:头插头删效率低下,往往需要挪动整个数组的数据,复杂度为O(N)。不能按需申请释放空间,扩容时往往会二倍扩容,往往会开出很大的一块空间,造成空间的浪费,释放时会释放整个数组的空所以bu。

list优点:支持任意位置的插入删除,复杂度为O(1),因为只需要更改指针的指向。按需申请释放空间,比如new一个结点,delete这个结点。

list缺点:物理空间不连续,所以不支持下标随机访问

再来讲讲deque的结构。图示如下。

deque在底层申请空间时,先申请buffer1这块空间, 假设每个buffer空间可以存储8个元素,当buffer1满了时,在进行尾插时,我们申请了buffer3这块空间,进行元素的插入,要进行头插时,我们申请了buffer2这块空间,进行头插。并且为了保证deque的连续,必须在buffer2的尾部插入,在buffer3的头部进行插入。

中控指针数组中存储的就是每个buffer的地址,且buffer1的地址要放在中间的位置,其它buffer的地址要根据对应buffer的位置进行填入,保证数据的顺序存储。指针数组一般采用vector进行存储。

那么deque作为适配器容器相比vector和list的优点是什么呢?

先抛开deque作为适配容器不谈,我们先来对比deque和vector和list这两个容器。通过deque的底层结构我们可以看出,deque在进行头插时并不像vector那样要移动整个数组的元素,从这一方面来看,deque优于vector容器。且deque也支持重载[]进行随机访问,具体的访问方式为,先判断当前下标是否在第一个buffer里,没有在就先减去第一个buffer中的元素个数,然后进行除和模操作确定这些元素具体的位置,因为每个buffer的空间其实并不是连续的,所以这个随机访问也并不像vector那样随机,随机访问这一点又优于list容器。

所以其实deque是融合了vector和list优点的一个容器,至于为什么没有替代vector和list,是因为deque虽然融合了vector和list的优点,但是并没有将vector和list的优点发挥到极致,比如头插时,又要开辟一大块的空间,而list只需要创建一个节点,更改指针指向。比如[]随机访问,又不像vector那样随机。所以纵使deque融合了vector和list的优点,vector和list在stl容器中的地位仍然是无法撼动的。

deque作为stack和queue的适配器容器较vector和list的优点又是什么呢?

较vector的优势:push_back元素时,空间不够进行扩容,并不会像vector那样扩容二倍,扩完容之后也不会拷贝数据,不会造成空间资源的浪费。

较list的优势:在底层deque的物理结构也是部分连续的,只要是连续的物理空间,那么cpu在访问数据时,cpu的命中效率一定是很高的,而list底层的物理结构不连续,所以cpu命中率不高。其次,不需要像list那样频繁地申请和释放空间,一次开一个buffer的空间,所以申请和释放空间的代价低。

以上便是本期的所有内容。本期的重点为stack和queue的相关接口以及容器适配器的概念,deque这个容器相关内容作为了解即可。

本期内容到此结束^_^ 

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

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

相关文章

go程序在windows服务中优雅开启和关闭

本篇主要是讲述一个go程序&#xff0c;如何在windows服务中优雅开启和关闭&#xff0c;废话不多说&#xff0c;开搞&#xff01;&#xff01;&#xff01;   使用方式&#xff1a;go程序 net服务启动 Ⅰ 开篇不利 Windows go进程编译后&#xff0c;为一个.exe文件,直接执行即…

使用api 调试接口 ,配置 Header 、 body 远程调试 线上接口

学习目标&#xff1a; 目标 使用api 调试接口 &#xff0c;配置 Header 、 body 远程调试 线上接口 学习内容&#xff1a; 内容 设置请求方式 2. 选择 POST 提交 3.设置 Header 一般默认的 4个 header 属性就可以直接使用&#xff0c;如有特殊情况&#xff0c;需进行属性设…

Docusaurus VS VuePress:哪一个更适合你的技术文档?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

springcloud接入seata管理分布式事务

下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…

关键词查找【Aho-Corasick 算法】

【全程干货】程序员必备算法&#xff01;AC自动机算法敏感词匹配算法&#xff01;动画演示讲解&#xff0c;看完轻松掌握&#xff0c;面试官都被你唬住&#xff01;&#xff01;_哔哩哔哩_bilibili 著名的多模匹配算法 引入依赖&#xff1a; <dependency><groupId>…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中&#xff0c;Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中&#xff0c;包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

前端知识--前端访问后端技术Ajax及框架Axios

一、异步数据请求技术----Ajax Ajax是前端访问后端的技术&#xff0c;为异步请求&#xff08;不刷新页面&#xff0c;请求数据&#xff0c;只更新局部数据&#xff09;。 例如&#xff1a;在京东网站中搜索电脑&#xff0c;就会出现一些联想搜索&#xff0c;但此时页面并没有…

AI行业合适做必应bing推广吗?怎么开户呢?

快速发展的AI行业中&#xff0c;有效的市场获客渠道是关键&#xff0c;随着数字营销领域的不断演进&#xff0c;必应Bing以其独特的市场定位、庞大的用户基础和高效的广告系统&#xff0c;成为AI企业推广策略中的重要一环。特别是针对那些寻求精准触达、高效转化的AI企业而言&a…

2024国际燃气轮机运维周线上分享第一期开启!共探燃机新生态

为促进国内重型燃气轮机运维技术发展&#xff0c;加快建立独立自主的燃气轮机运维技术体系&#xff0c;2024国际燃气轮机运维大会将于2024年10月17-18日在中国广州盛大召开&#xff01; 2024国际燃气轮机运维大会将通过线上直播会议、线下技术分享及颁奖典礼等形式展开&#xf…

血泪史!ora-00600 16305报错解决过程

一个客户重启操作系统后数据库启动不了,检查日志发现报错ORA-00600 [16305] 在MOS中找了一下,发现说是loopback地址不通: 测试了一下ping 127.0.0.1不通. 再次多次尝试发现登录到服务器上面,在本机上ping 127 localhost 本机实际地址 都不通,但是其它服务器可以ping通他的…

W30-python03-迭代器和生成器

迭代器&#xff1a;迭代是Python最强大的功能之一&#xff0c;是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法&#xff1a;iter() 和 next()。 生成器&#xff1…

Godot入门 05收集物品

创建新场景&#xff0c;添加Area2D节点&#xff0c;AnimatedSprite2D节点 &#xff0c;CollisionShape2D节点 添加硬币 按F键居中&#xff0c;放大视图。设置动画速度设为10FPS&#xff0c;加载后自动播放&#xff0c;动画循环 碰撞形状设为圆形&#xff0c;修改Area2D节点为Co…

Java---后端文件上传详解

袁门才俊志高远&#xff0c; 震古烁今意决然。 风采翩翩才情显&#xff0c; 雄姿英发立世间。 目录 一&#xff0c;简单案例演示 二&#xff0c;服务器本地存储 三&#xff0c;配置单个文件上传大小限制 一&#xff0c;简单案例演示 首先简单编写一个前端网页&#xff1a; &l…

scrapy 爬取旅游景点相关数据(一)

第一节 Scrapy 练习爬取穷游旅游景点 配套视频可以前往B站&#xff1a;https://www.bilibili.com/video/BV1Vx4y147wQ/?vd_source4c338cd1b04806ba681778966b6fbd65 本项目为scrapy 练手项目&#xff0c;爬取的是穷游旅游景点列表数据 0 系统的环境 现在网上可以找到很多scr…

java基础概念05-运算符

一、自增自减运算符 二、赋值运算符 2-1、注意 三、关系运算符 四、逻辑运算符 4-1、短路逻辑运算符 五、三元运算符 六、运算符的优先级

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始

我是从excel中将数据导入&#xff0c;然后再通过sql插入数据&#xff0c;就报错。 需要设置自增ID开始值 1、确定序列名称&#xff1a; 首先&#xff0c;需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id&#xff0c;可以使用以下查询来获取序列名称…

嵌入式C++、Raspberry Pi、LoRa和Wi-Fi技术、TensorFlow、ROS/ROS2:农业巡检数据导航机器人设计流程(代码示例)

随着科技的不断进步&#xff0c;农业领域也在逐渐向智能化发展。农业巡检机器人作为农业智能化的重要组成部分&#xff0c;能够自动化地监测农作物生长状况&#xff0c;提高农业管理的效率和精确度。本文将介绍一个基于Raspberry Pi和NVIDIA Jetson的农业巡检机器人&#xff0c…

华天动力OA downloadWpsFile接口处任意文件读取漏洞复现 [附POC]

文章目录 华天动力OA downloadWpsFile接口处任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现华天动力OA downloadWpsFile接口处任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…

学习日记:输入输出

目录 1.概念 2. C语言函数库提供的输入输出函数 2.1 getchar 2.2 putchar 2.3 printf 附&#xff1a;占位符 2.4 scanf 3. 附加 1.概念 输入是从键盘、鼠标等设备向计算机&#xff08;内存&#xff09; 注&#xff1a;c语言本身不提供输入输出功能&#xff0c;使用的…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十章 Linux用户层和内核层

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…