stack,queue与deque

一.模拟实现stack和queue

STL中的stac和queuek是通过容器适配器来实现的,并不是直接实现栈。那什么是容器适配器呢?

举一个简单的例子,不同的插座需要不同的插头来连接,这时候我们用一个插座适配器,我们就不需要关心自己本身的插头,相当于加了一层中间层。

在STL中stack和queue就像适配器一样,只是对其他容器的接口进行封装,例如stack和queue在STl中就是用deque进行封装。

下面我们来进行模拟实现:

cpp 复制代码
namespace ge
{
	template<class T,class Container = deque<T>>//不关心container是什么容器,container已经实现好的容器,通过对stack重新封装来完成
	class stack
	{
	public:
		stack()//构造函数没有内容会默认走private下的构造
		{}

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

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

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

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

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

		bool empty()const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

这里我的private内容是一个模板,用来传容器类型例如vector,list这样的。函数构造时会直接走private部分。其余部分就是对容器进行一个函数调用,较为简单。

cpp 复制代码
namespace wen
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		queue()
		{}

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

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

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

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

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

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

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

		bool empty() const
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
}

stack和queue只需要在头尾进行访问不需要访问中间的元素,因此不需要迭代器来遍历。

二.deque

deque是一个支持随机访问的容器,他的功能和vector和list功能类似。那么为什么要重新单独实现一个deque呢?vector优点在于支持下标随机访问,但是在扩容和中间插入时有一定效率缺陷。list可以高效的进行插入,但不支持随机访问。

所以deque是结合了两者的优点创建出来的容器,对两者进行功能的融合。

deque是一个双端队列支持首尾的插入和删除。deque存储数据时是使用一个buffer数组,当buffer数组存储满之后,再重新开辟一个buffer数组进行存储。通过一个中控器存储数组的指针将各个数组构造出一个假象的物理连续,其实他们在空间上并不是连续的。

与vector比较deque的优势是在头部插入和删除时不需要移动元素,效率较高。扩容时也不需要搬移元素。与list相比,他的底层空间是连续的空间利用率高。

但deque有个致命缺陷,当需要遍历时效率低下。

那为什么要选择deque作为stack和queue的底层容器呢?

stack和queue不需要遍历(不需要迭代器),只需要在两端进行操作。在数据增长时deque不需要搬移数据比vector效率要高。这样就完美避开了deque的缺点结合了其优点。

相关推荐
漂流瓶jz7 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
A boy CDEF girl12 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
图灵-M16 小时前
【数据结构】静态 & 动态顺序表
c语言·数据结构·笔记
careathers17 小时前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法
XiYang-DING18 小时前
P4104.环形链表判断
数据结构·链表
逆向编程19 小时前
MATLAB高级数据结构:cell、struct与table深度应用
开发语言·数据结构·matlab
m0_639906941 天前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
2601_970703831 天前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
丘山望岳2 天前
单调栈和单调队列
数据结构
UIU1142 天前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯