【STL】queue,stack的底层实现

在前面的介绍中我们已经知道了queue和stack是一个容器适配器,它并没有被划分到容器的行列,它只是对其他容器的再封装,在STL中queue和stack默认使用的容器是deque

在数据结构的学习中,我们知道stack和queue可以使用顺序表和链表实现,若我们在这里定义一个vector让stack进行包装实现,实际上就是stack中的每个接口的实现都复用了vector的接口

Stack的模拟实现

stack接口:

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

模拟实现:

cpp 复制代码
template<class T, class container>
class stack
{
public:
	void push(const T& s)
	{
		return _con.push_back(s);
	}

	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>& s)
	{
		_con.swap(s);
	}
private:
	container _con;
};

Queue的模拟实现

queue接口:

|-------|----------|-----------------|
| 成员函数 | 函数功能 | 实现方法 |
| push | 元素入队列 | 调用指定容器push_back |
| pop | 删除队头元素 | 调用指定容器pop_back |
| front | 获取队头元素 | 调用指定容器front |
| back | 获取队尾元素 | 调用指定容器back |
| size | 获取有效元素个数 | 调用指定容器size |
| empty | 判断队列是否为空 | 调用指定容器empty |
| swap | 交换两个队列元素 | 调用指定容器swap |

cpp 复制代码
template<class T, class container = deque<T>>
class queue
{
public:

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

	void pop()
	{
		_con.erase(_con.begin());
	}
	
	T& front()
	{
		return _con.front();
	}

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

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

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

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

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

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

以上就完成了对stack和queue的实现,很简单

相关推荐
二川bro5 分钟前
模型部署实战:Python结合ONNX与TensorRT
开发语言·python
联系QQ:2769988511 分钟前
电化学与冷启动仿真的赝电容计算及GITT扩散系数研究——阻抗分析拟合与全电池电容器性能评估
开发语言
言言的底层世界35 分钟前
c++中STL容器及算法等
开发语言·c++·经验分享·笔记
Mr_WangAndy42 分钟前
C++17 新特性_第一章 C++17 语言特性___has_include,u8字符字面量
c++·c++40周年·c++17新特性·__has_include·u8字面量
liu****1 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
韭菜钟1 小时前
在Qt中使用QuickJS
开发语言·qt
Vanranrr1 小时前
C++临时对象与悬空指针:一个导致资源加载失败的隐藏陷阱
服务器·c++·算法
β添砖java1 小时前
python第一阶段第六章python数据容器
开发语言·python
YouEmbedded1 小时前
解码C++基础——从C到C++
开发语言·从c到c++
yong99901 小时前
基于多普勒连续波雷达原理的MATLAB测速程序
开发语言·matlab