当前位置: 首页 > article >正文

STL(八)—— stack和queue的模拟

目录

  • 一、容器适配器
  • 二、stack的模拟实现
  • 三、queue的模拟实现


一、容器适配器

stack和queue有一点需要注意的是,虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器。
在stack和queue的类模板声明当中我们就可以看到,它们的模板参数有两个,第一个是stack和queue当中所存储的元素类型,而另一个就是指定使用的容器类型。只不过当我们不指定使用何种容器的情况下,stack和queue都默认使用deque作为指定容器。
在这里插入图片描述

简单理解: 学过数据结构后我们都知道,stack和queue既可以使用顺序表实现,也可以使用链表实现。在这里我们若是定义一个stack,并指定使用vector容器,则定义出来的stack实际上就是对vector容器进行了包装

二、stack的模拟实现

知道了容器适配器后,stack的模拟实现就很简单,只需要调用所指定容器的各个成员函数即可实现stack的各个函数接口。

成员函数函数作用实现方法
push元素入栈调用所指定容器的push_back
pop元素出栈调用所指定容器的pop_back
top获取栈顶元素调用所指定容器的back
size获取栈中有效元素个数调用所指定容器的size
empty判断栈是否为空调用所指定容器的empty
swap交换两个栈中的数据调用所指定容器的swap

模拟如下

#pragma once
#include<vector>
#include<list>
namespace ling
{
	//容器适配器
	template<class T,class Container = std::vector<T>>		
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);	
		}
		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<vector>
#include<list>

namespace ling
{	//vector在这里不适合
	template<class T, class Container = std::list<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			//_con.pop_front();			如果要适配vector就不能直接写头删,因为vector没有提供头删函数
			_con.erase(_con.begin());		//通用

		}
		T& front()
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		size_t size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty;
		}
	private:
		Container _con;
	};
}

可见它们是很类似的


http://www.kler.cn/a/542645.html

相关文章:

  • GitCode 助力 Easy-Es,革新 Elasticsearch 开发体验
  • 参考数据和主数据:构建数据管理的基石
  • DeepSeek 助力 Vue 开发:打造丝滑的步骤条
  • elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)
  • 综合评价 | 基于随机变异系数-TOPSIS组合法的综合评价模型(Matlab)
  • MongoDB 有哪些特性
  • DeepAR:一种用于时间序列预测的深度学习模型
  • 大语言模型安全威胁深度解析:攻击手法与实战案例
  • STM32自学记录(十)
  • 数据结构:排序—归并排序(四 )
  • 矩阵 NFC 碰一碰发视频源码搭建技术解析,支持OEM
  • STM32 HAL库 PWM程序(C语言)
  • 【02】RUST项目(Cargo)
  • 第六篇:数字逻辑的“矩阵革命”——域控制器中的组合电路设计
  • 如何将网站提交百度收录完整SEO教程
  • Ubuntu 安装 NVIDIA 驱动实操指南(含卸载)
  • 【pytest】获取所有用例名称并存于数据库
  • python tkinter实现deepseek的连接访问
  • 新一代高性能无线传输模块M-GATEWAY3
  • Flink-序列化
  • 生产环境超实用Shell脚本三
  • JAVA (Springboot) i18n国际化语言配置
  • JVM 中的各种收集器总结
  • 为什么用源码搭建体育比分直播系统更高效
  • 线上HBase client返回超时异常分析 HBase callTimeout=60000
  • Docker 安装指南:Windows、Mac、Linux