【C++】模拟实现queue

news2024/11/16 12:24:30

 🦄个人主页:修修修也

🎏所属专栏:实战项目集

⚙️操作环境:Visual Studio 2022

​​


 一.了解项目功能

📌了解queue官方标准

       在本次项目中我们的目标是模拟实现一个queue,先一起看一下C++标准文档中queue的定义:cplusplus : C++ queue标准文档icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/queue/queue/

        总结一下:

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

         更多有关数据结构——队列相关的基础知识可以移步:【数据结构】什么是队列icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/134608979文章目录如下:


📌了解模拟实现queue

        在本次项目中我们的目标是实现一个queue容器适配器:

        该queue容器适配器底层可以使用vector或list来实现,但是使用vector来实现一个队列进行头删效率是非常低的,所以我们从底层上否定了vector作为queue底层的可能,只使用list或deque来实现queue.我们可以借助模板来一次性实现既可以使用链式底层的队列,又可以实现deque底层的队列:

        queue提供的功能有:

  1. push()
  2. pop()
  3. front()
  4. back()
  5. size()
  6. empty()

二.逐步实现项目功能模块及其逻辑详解

通过第一部分对项目功能的介绍,我们已经对queue的功能有了大致的了解,虽然看似需要实现的功能很多,貌似一时间不知该如何下手,但我们可以分步分模块来分析这个项目的流程,最后再将各部分进行整合,所以大家不用担心,跟着我一步一步分析吧!


!!!注意,该部分的代码只是为了详细介绍某一部分的项目实现逻辑,故可能会删减一些与该部分不相关的代码以便大家理解,需要查看或拷贝完整详细代码的朋友可以移步本文第四部分。


📌实现queue成员变量

        因为queue的底层是用deque或list来实现的,所以我们只需要定义一个deque或list成员变量即可.但因为我们选择将queue写成类模板,所以这里成员变量的类型是模板类型.

        其实可以理解为queue的底层就是一个deque或list,但我们通过类的特性,对deque或list进行进一步的封装,使其行为符合queue的行为,就完成了一个queue类.

该部分功能实现代码如下: 

namespace mfc
{
	//容器适配器
	template<class T, class Container = list<T>>//队列底层是拿什么实现的(list和deque)
	//模板也可以给缺省参数
	class queue
	{
	public:
        //成员函数:
	
	private:
        //成员变量:
		Container _con;

	};
}

📌实现push()函数

        queue的push()就是在容器尾部插入一个元素,因为底层的deque或list都实现有尾插函数push_back(),所以我们直接调用就可以,代码如下:

void push(const T& x)
{
	_con.push_back(x);
}

📌实现pop()函数

        queue的pop()函数就是在容器头部删除一个元素,同样deque和list有实现pop_front()函数,我们直接调用即可,代码如下:

void pop()
{
	//这句可以适配vector,但是vector头删效率很低,我们还是不支持vector底层的queue了
	//_con.erase(_con.begin());

	_con.pop_front();//这句只有list有接口
}

📌实现front()函数

        queue的front()函数就是获取容器头部的元素,deque和list都有实现front()函数,我们可以直接调用,代码如下:

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

📌实现back()函数

        queue的back()函数就是获取容器尾部的元素,deque和list都有实现back()函数,我们可以直接调用,代码如下:

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

📌实现size()函数

        queue()的size()函数同样可以直接调用底层容器的size()函数,代码如下:

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

📌实现empty()函数

        queue()的empty()函数同样可以直接调用底层容器的empty()函数,代码如下:

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

四.项目完整代码

        因为模板定义和声明不能分离,所以我们将程序运行的代码分别在两个工程文件中编辑,完整代码如下:

test.cpp文件

#include<iostream>
#include<list>
#include<vector>

using namespace std;
#include"Queue.h"

int main()
{
	mfc::test_queue();
	return 0;
}

Queue.h文件

#pragma once

namespace mfc
{
	//容器适配器
	template<class T, class Container = list<T>>//队列底层是拿什么实现的(deque和liqu)
	//模板也可以给缺省参数
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			//这句可以适配vector,但是vector头删效率很低,我们还是不这样用了
			//_con.erase(_con.begin());
			_con.pop_front();
		}

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

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

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

	private:
		Container _con;

	};
	void test_queue()
	{
		queue<int> qu1;//不传参数默认是list底层
		qu1.push(1);
		qu1.push(2);
		qu1.push(3);
		qu1.push(4);
		while (!qu1.empty())
		{
			cout << qu1.front() << " ";
			qu1.pop();
		}
		cout << endl;

		queue<int, deque<int>> qu2;
		qu2.push(1);
		qu2.push(2);
		qu2.push(3);
		qu2.push(4);
		while (!qu2.empty())
		{
			cout << qu2.front() << " ";
			qu2.pop();
		}
		cout << endl;
	}
}

测试效果:


结语

希望这篇queue的模拟实现详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C++】模拟实现stack

【C++】模拟实现list

【C++】模拟实现vector

【C++】标准库类型vector

【C++】模拟实现string类

【C++】构建第一个C++类:Date类

【C++】类的六大默认成员函数及其特性(万字详解)

【C++】什么是类与对象?


​​

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

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

相关文章

中英文字翻译,这几款软件值得收藏!

在这个全球化的时代&#xff0c;语言不再是沟通的障碍&#xff0c;而翻译软件则成为了我们跨越语言鸿沟的得力助手。今天&#xff0c;就让我们一起探索三款让英文翻译变得前所未有的简单与高效的神奇软件&#xff0c;无论是学习、工作还是旅行&#xff0c;它们都能成为你不可或…

kickstart无人值守以及pxe实现服务器自动部署

使用背景 在企业中安装多台操作系统时会面临的问题&#xff1a;当安装Linux操作系统时&#xff0c;安装过程会需要回答很多关于设定的问题 这些问题必须手动选择&#xff0c;否则无法进行安装 。当只安装1台Linux系统&#xff0c;手动选择设定工作量比较轻松 当安装多台Linux&a…

PSO_GA混合算法优化PID参数(附代码)

由于PSO算法本身的缺陷,其存在容易出现早熟收敛、后期迭代效率不高、搜索精度不高的问题,在线性递减惯性权重PSO算法的基础上,与GA遗传算法相结合,针对PSO易陷入局部最优,通过采用GA杂交变异的思想,增加了粒子的多样性,跳出局部最优,增强混合算法的全局搜索能力,提高搜…

完美解决pip命令版本冲突导致对应版本模块包无法安装的问题

解决步骤 使用pip更新/降低指定模块包命令格式降低pip自身至指定版本的命令再次换源安装指定模块包 在对 FasterNet 这篇论文源码复现过程中&#xff0c;我们首先需要安装相关依赖文件&#xff08; path/to/your/requirements.txt&#xff09; -extra-index-url https://down…

CentOS7 VMware虚拟机基于NAT配置网络IP

目录 前言 VMnet8 虚拟网络编辑 ens33 ping 防火墙 前言 平时学习时一直需要用到Linux服务器&#xff0c;一般都是在Windows上安装VMware来创建一个虚拟机。创建的虚拟机需要配置网络才能够访问外网&#xff0c;可以通过以下两种方式来配置虚拟机网络 桥接模式NAT模式&…

给儿童掏耳朵用什么工具好?TOP4机型实测数据大公开

作为一名专业的个护测评师&#xff0c;我深知宝宝掏耳朵是一件多难的事情&#xff0c;由于宝宝的耳朵属于盲区。在为他操作时&#xff0c;很容易伤及宝宝的耳膜。因此&#xff0c;帮宝宝掏耳朵时工具的选择非常的重要。然而市场上许多跨界大牌存在隐患。某些网红品牌&#xff0…

视频发光字体特效怎么做 会声会影字体怎么淡化退出 视频剪辑制作教程

视频字体样式在视频制作中起着重要的作用&#xff0c;它可以帮助传达信息、增强视觉吸引力、提供情感表达、强调关键信息和提供文化背景解读等。这篇文章以会声会影为例&#xff0c;来一起看看发光字体制作&#xff0c;字体怎么淡化退出等内容。 你可以在这里免费下载会声会影…

Spring-Kafka确认机制报错:No Acknowledgment available as an argument

问题出现 在spring boot集成kafka时报错&#xff0c;报错信息&#xff1a; No Acknowledgment available as an argument, the listener container must have a MANUAL AckMode to populate the Acknowledgment.翻译&#xff1a; Acknowledgment 参数不可用&#xff0c;监听…

thingsboard-3.6.4 源码编译运行

1.首先我们要检查我们所需要的环境是否全部安装&#xff0c;还有对应的版本&#xff0c;一定要按照项目要求的版本来&#xff0c;要不然你会给自己挖很多坑。 我们使用的是3.6.4的版本&#xff0c;下面的版本全是基于这个版本的。需要安装好已经配置环境变量。 这部分大家就自…

adaboost提升方法

集成学习&#xff1a;串联&#xff08;提升方法&#xff09;&#xff0c;并联&#xff08;随机森林&#xff09; Adaboost&#xff1a;分类加法模型&#xff08;更新样本权值&#xff0c;投票权值-由权值误差率决定&#xff09; 提升树&#xff1a;回归加法模型 &#xff08;…

Linux驱动开发—平台总线模型详解

文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型&#xff08;Platform Bus Model&#xff09;是一种设备驱动框架&#xff0c;用于…

软件测试老兵的十条生存法则

在当下的数字化时代&#xff0c;软件测试行业正经历快速的变革和发展。自动化测试、持续集成和持续交付&#xff08;CI/CD&#xff09;、人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;、云计算和DevOps等技术正在重塑软件测试的各个方面。这些变化不…

全国产Gpixel图像传感器+FPGA+AI高帧率机器视觉工业相机解决方案

近些年来&#xff0c;机器视觉广泛应用于智能制造、自动化等设备中&#xff0c;用来保证产品质量&#xff0c;控制生产流程&#xff0c;感知环境等。面对不同的应用场景&#xff0c;检测系统需要满足不同的技术指标。其中图像传感器的分辨率和帧率是两个极为重要的指标&#xf…

2023级JavaScript与jQuery

第一课&#xff1a;JavaScript概述 一.预习笔记 1.认识JavaScript 1-1&#xff1a;1995年&#xff0c;NetScape公司与Sun公司联合开发出JavaScript脚本语言 1-2&#xff1a;JavaScript的作用 1&#xff09;客户端表单验证 2&#xff09;页面动态效果 3&#xff09;动态改…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-03 IP_ARP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

基于Golang实现Kubernetes边车模式

本文介绍了如何基于 Go 语言实现 Kubernetes Sidecar 模式&#xff0c;并通过实际示例演示创建 Golang 实现的微服务服务、Docker 容器化以及在 Kubernetes 上的部署和管理。原文: Sidecar Pattern with Kubernetes and Go[1] 在这篇文章中&#xff0c;我们会介绍 Sidecar 模式…

【分享】2022年291个城市的人均GDP数据,附带数据获取方式

2022年291个城市的人均GDP数据涉及全国地级及以上城市的经济发展水平。在这份详尽的数据中&#xff0c;包括了众多城市的经济表现&#xff0c;并依据国际标准对它们的经济状况进行了分类。具体如下&#xff1a; 人均GDP高值城市 鄂尔多斯&#xff1a;鄂尔多斯市位于内蒙古自治区…

单位企业邮箱有什么优势

单位企业邮箱成为了企业内外沟通的重要工具。单位企业邮箱的优势有什么呢&#xff1f;一、统一专业形象&#xff1b;二、高效沟通&#xff1b;三、安全保障&#xff1b;四、便捷管理&#xff1b;五、定制服务等。本文将深入探讨单位企业邮箱的独特优势&#xff0c;帮助您了解为…

格力美容仪售价9800元 董明珠:用一周发现变美了

近日&#xff0c;格力电器董事长兼总裁董明珠在格力冰洗生活电器战略发布会上透露&#xff0c;公司已研发了美容仪。 《时代周报》记者查询格力董明珠店官网发现&#xff0c;目前有一款名为“格力微电流美容仪”的产品在售卖&#xff0c;售价9800元&#xff0c;截至发稿已售出…

详解直铺防静电瓷砖的特点与优势

防静电地板分为架空防静电地板和直铺防静电地板&#xff0c;直铺式防静电地板是一种直接铺设在地面上的地板系统&#xff0c;防静电瓷砖就是常用的直铺防静电地板之一。防静电瓷砖是在瓷砖烧制过程中加入防静电功能粉体进行物理改性&#xff0c;规格为600*600*10mm&#xff0c;…