C++STL---stack queue模拟实现

news2024/11/18 21:34:13

前言

对于这两个容器适配器的模拟实现非常简单,因为stack和queue只是对其他容器的接口进行了包装,在STL中,若我们不指明用哪种容器作为底层实现,栈和队列都默认是又deque作为底层实现的。

也就是说,stack和queue不管是用哪种容器实现出来的,实际上定义出来的都是对容器进行了封装。

stack的模拟实现

所以我们知道了容器适配器实际上是对其他容器的封装之后,我们实现的时候就只需要调用底层容器的各个成员函数实现stack的接口就行:

成员函数及作用模拟实现方法
push(元素入栈)调用指定容器的push_back
pop(元素出栈)

调用指定容器的pop_back

top(获取栈顶元素)调用指定容器的back
size(获取栈中有效元素个数)调用指定容器的size
empty(判断栈是否为空)调用指定容器的empty
swap(交换两个栈中的数据)调用指定容器的swap

模拟实现的代码如下:

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

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

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

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

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

		void swap(stack<T,Container>& st)
		{
			_con.swap(st._con);
		}

	private:
		Container _con;
	};
}

queue模拟实现

同样的我们也通过调用指定容器的成员函数来模拟实现queue。

成员函数及作用模拟实现方法
push(元素队尾入队)调用指定容器的push_back
pop(元素队头出队)调用指定容器的pop_front
front(获取队头元素)调用指定容器的front
back(获取队尾元素)调用指定容器的back
size(获取队列中有效数据个数)调用指定容器的size
empty(判断队列是否为空)调用指定容器的empty
swap(交换两个队列中的数据)调用指定容器的swap

模拟实现的代码如下:

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

namespace CYF
{
	template<class T,class Container=deque<T>>
	class queue 
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}

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

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

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

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

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

		void swap(queue<T,Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;
	};
}

下面这是test.cpp中的测试代码:

#include"myStack.h"
#include"myQueue.h"
void test1()
{
	CYF::stack<int, vector<int>> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
}

void test2()
{
	CYF::queue<int, list<int>> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
	cout << endl;
}

int main()
{
	//test1();
	test2();
	return 0;
}

以上就是本篇的全部内容,谢谢大家!

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

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

相关文章

Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld

文章目录 前言一、Django环境配置1、python 环境2、Django环境3、mysql环境4、IDE&#xff1a;pycharm 二、第一次创建Django项目1、创建项目door_web_django_system2、运行启动 三、Django项目介绍1、介绍Django项目结构2、第一个helloword4、django的项目逻辑&#xff08;和j…

为什么PPT录制没有声音 电脑ppt录屏没有声音怎么办

一、为什么PPT录制没有声音 1.软件问题 我们下载软件的时候可能遇到软件损坏的问题&#xff0c;导致录制没有声音&#xff0c;但其他功能还是可以使用的。我建议使用PPT的隐藏功能&#xff0c;下载插件&#xff0c;在PPT界面的加载项选项卡中就能使用。我推荐一款可以解决录屏…

探索风电机组:关键软件工具全解析

探索风电机组&#xff1a;关键软件工具全解析 随着可再生能源市场的迅猛发展&#xff0c;风电作为一种重要的可再生能源&#xff0c;其相关技术和工具也越来越受到重视。风电机组的设计、仿真、优化及运维等方面&#xff0c;都需要依靠一系列专业软件工具来实现。这些软件涵盖…

链表的回文结构OJ

链表的回文结构_牛客题霸_牛客网对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为。题目来自【牛客题霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&a…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…

RFID测温技术在电力行业的革命性应用

随着科技的快速发展, RFID技术在各个领域的应用越来越广泛&#xff0c;而其中的一个重要领域就是电力行业。这一无线测温技术以其非接触、实时、高精度的特点&#xff0c;为电力设备的温度监测带来了革命性的改变。电力行业作为国家基础设施建设的重要支柱&#xff0c;设备的安…

使用GitHub托管静态网页

前言​&#xff1a; 如果没有服务器&#xff0c;也没有域名&#xff0c;又想部署静态网页的同学&#xff0c;那就可以尝试使用GitHub托管自己的网页​。 正文&#xff1a; 首先要有自己的GitHub的账号&#xff0c;如果没有可以自己搜索官网进行注册登录&#xff0c;国内对Gi…

git【工具软件】分布式版本控制工具软件

一、Git 的介绍 git软件的作用&#xff1a;管理软件开发项目中的源代码文件。 常用功能&#xff1a; 仓库管理、文件管理、分支管理、标签管理、远程操作 功能指令&#xff1a; add&#xff0c;commit&#xff0c;log&#xff0c;branch&#xff0c;tag&#xff0c;remote…

增加强制索引依然慢

版本: 阿里云RDS MySQL 8.0.25 线上数据库CPU达到100%, 定位到如下SQL EXPLAIN SELECT ssd.goods_no,ssd.goods_name,ssd.goods_spec,ssd.goods_unit,ssd.create_time,w.warehouse_name,sb.batch_no,swl.warehouse_region_location_name,sc.customer_name AS goodsOwnerName,s…

数据分析必备:一步步教你如何用Pandas做数据分析(19)

1、Pandas 日期函数 Pandas 日期函数操作实例 扩展时间序列&#xff0c;日期功能在财务数据分析中起着重要作用。使用日期数据时&#xff0c;我们经常会遇到以下情况- 生成日期序列 将日期序列转换为不同的频率 2、创建日期范围 通过指定日期和频率使用date.range()函数&…

Redis高频面试基本问题整理

文章目录 1、Redis底层协议2、Redis的热Key问题如何解决3、Redis是单线程还是多线程4、 什么是脑裂问题&#xff1f;5、redis集群会有写操作丢失吗&#xff1f;6、什么是 Redis 的 Pipeline&#xff1f;它有哪些优点&#xff1f;7、redis主从复制、哨兵机制、集群的理解8、缓存…

ssh远程转发22端口,使用shell工具进行连接|使用服务器地址ssh连接本地ubuntu|端口映射

☆ 问题描述 我在内网主机中&#xff0c;使用docker创建了多个虚拟机&#xff0c;我希望能通过我的公网ip服务器端口进行shell访问 ★ 解决方案 我创建一个新的虚拟机为例 1. 创建并打开容器 docker run -itd --name test ubuntu2. 进入容器 docker exec -it test /bin/b…

Rocky Linux安装与基础配置

目录 背景与起源 主要特点 目标用户 发展前景 下载 安装 常用配置命令&#xff1a; 更换镜像源 Rocky Linux 是一个开源的、由社区驱动的操作系统&#xff0c;旨在使用 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源码构建的下游二进制兼容发行版。以下是关于…

[word] word冻结单元格在哪里 #微信#笔记#职场发展

word冻结单元格在哪里 我们在制作一个Excel表格的时候&#xff0c;如果行数较多&#xff0c;列数也较多时&#xff0c;一旦向下滚屏&#xff0c;则上面的标题行也跟着滚动&#xff0c;在处理数据时往往难以分清各列数据对应于表头的标题&#xff0c;容易搞错位置。 其实&…

全程自动化操作 自动生成图文发布,矩阵批量软件系统 日产1-3万篇

一、简介 图文发布对于现代网站运营至关重要&#xff0c;然而手动创建和发布图文内容效率低下且易出错。全自动化图文生成发布流程可以解决这个问题。本文将详细说明如何以编程方式实现这一流程。 二、模块设计 该流程主要包含三个模块&#xff1a;图像生成&#xff0c;文本生成…

Android中打印某应用的堆栈信息

先更具报名获取pid adb shell "ps|grep 包名" zygote的堆栈dump 实际上这个可以同时dump java线程及native线程的堆栈&#xff0c;对于java线程&#xff0c;java堆栈和native堆栈都可以得到。 kill -3 <pid> debuggerd的堆栈dump debuggerd是android的一个…

网络安全实验BUAA-全套实验报告打包

下面是部分BUAA网络安全实验✅的实验内容 &#xff1a; 认识路由器、交换机。掌握路由器配置的基本指令。掌握正确配置路由器的方法&#xff0c;使网络正常工作。 本博客包括网络安全课程所有的实验报告&#xff1a;内容详细&#xff0c;一次下载打包 实验1-路由器配置实验2-AP…

5 分钟内构建一个简单的基于 Python 的 GAN

文章目录 一、说明二、代码三、训练四、后记 一、说明 生成对抗网络&#xff08;GAN&#xff09;因其能力而在学术界引起轩然大波。机器能够创作出新颖、富有灵感的作品&#xff0c;这让每个人都感到敬畏和恐惧。因此&#xff0c;人们开始好奇&#xff0c;如何构建一个这样的网…

社区服务支持

社区服务支持 原创 小王搬运工 时序课堂 2024-06-07 19:29 四川 &#x1f31f; 邀请函 | 加入我们的时序数据挖掘社区 &#x1f680; 尊敬的数据爱好者们&#xff0c; 我们诚挚地邀请您加入我们的专业社区——时序数据挖掘社区&#xff0c;一个专注于时序数据分析、挖掘与应…

安装Android Studio报错unable to access android sdk add-on list的解决方案

1. 安装报错 初次安装Android Studio时&#xff0c;提示报错如下&#xff1a; unable to access android sdk add-on lis2. 报错原因 安装Android Studio时&#xff0c;会在默认路径下检测是否有Android SDK&#xff0c;如果没有的话&#xff0c;就会报上述错误。 3. 解决方…