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的缺点结合了其优点。

相关推荐
秋难降1 小时前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih3 小时前
嵌入式系统学习Day19(数据结构)
数据结构·学习
DdduZe4 小时前
8.19作业
数据结构·算法
PyHaVolask4 小时前
链表基本运算详解:查找、插入、删除及特殊链表
数据结构·算法·链表
1白天的黑夜15 小时前
链表-2.两数相加-力扣(LeetCode)
数据结构·leetcode·链表
花开富贵ii5 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
熬了夜的程序员5 小时前
【LeetCode】16. 最接近的三数之和
数据结构·算法·leetcode·职场和发展·深度优先
Miraitowa_cheems5 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法
_poplar_8 小时前
08.5【C++ 初阶】实现一个相对完整的日期类--附带源码
c语言·开发语言·数据结构·c++·vscode·算法·vim
汤永红8 小时前
week2-[一维数组]最大元素
数据结构·c++·算法·信睡奥赛