STL详解—— stack和queue的模拟实现

Posted 2021dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

实现代码如下:

namespace cl //防止命名冲突
{
	template<class T, class Container = std::deque<T>>
	class stack
	{
	public:
		//元素入栈
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//元素出栈
		void pop()
		{
			_con.pop_back();
		}
		//获取栈顶元素
		T& top()
		{
			return _con.back();
		}
		const T& top() const
		{
			return _con.back();
		}
		//获取栈中有效元素个数
		size_t size() const
		{
			return _con.size();
		}
		//判断栈是否为空
		bool empty() const
		{
			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

实现代码如下:

namespace cl //防止命名冲突
{
	template<class T, class Container = std::deque<T>>
	class queue
	{
	public:
		//队尾入队列
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//队头出队列
		void pop()
		{
			_con.pop_front();
		}
		//获取队头元素
		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() const
		{
			return _con.size();
		}
		//判断队列是否为空
		bool empty() const
		{
			return _con.empty();
		}
		//交换两个队列中的数据
		void swap(queue<T, Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;
	};
}

以上是关于STL详解—— stack和queue的模拟实现的主要内容,如果未能解决你的问题,请参考以下文章

C++STL之stack和queue以及deque详解

[C/C++]详解STL容器3--stackqueue和priority_queue的功能和模拟实现,deque和容器适配器的介绍

C++:STL——栈队列和优先级队列的模拟实现

[ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现

C++STL之stackqueue的使用和模拟实现+优先级队列(附仿函数)+容器适配器详解

C++STL-stack与queue以及priority_queue