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 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘1 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包2 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表
All for pursuit.2 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
50万马克的面包2 小时前
数据结构01-数据结构概念与复杂度-博客稿
数据结构
Logic1012 小时前
C语言/数据结构贪心算法题解:字符串趋同——逐位统计最高频率求最小修改代价
c语言·数据结构·贪心算法·字符串·时间复杂度·频率统计·算法题
红豆诗人4 小时前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法
H.莓飛4 小时前
【数据结构】堆_OJ题
linux·数据结构·算法
7yewh13 小时前
SLAM 三维空间刚体运动(2)
数据结构·人工智能·机器人·嵌入式·slam
leikooo13 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust