C++初阶(十八)--STL--stack和queue的模拟实现

发布于:2024-12-06 ⋅ 阅读:(111) ⋅ 点赞:(0)

目录

容器适配器

stack的模拟实现

queue的模拟实现


容器适配器

        容器适配器(Container Adapter)是一种设计模式,在 C++ 的标准模板库(STL)中,它是一种特殊的容器。容器适配器本质上是对已有容器进行包装,提供了一种受限的、特定用途的接口,以适应特定的编程需求。它并不提供像普通容器(如vectorlist等)那样完整的功能集,而是专注于实现特定的操作模式。

常见的容器适配器,有栈(stack),队列(queue),优先队列(priority queue)

STL中的栈和队列适配器通常是基于deque实现的,deque是一个双端队列,它的底层实现较为巧妙,感兴趣的可以自己去看一下,这里就不做讲解了

而优先队列适配器是基于堆来实现的,下一篇博客我们会对它进行讲解。

stack的模拟实现

 在stack的类模板声明中我们可以看到有两个参数,第一个是stack中所存储的元素类型,第二个是指定使用的容器类型,默认情况下是deque。

 如果我们可以指定容器,那我们就可以直接调用指定容器的接口。

简单理解:学过数据结构后我们都知道,stack和queue既可以使用顺序表实现,也可以使用链表实现。在这里我们若是定义一个stack,并指定使用vector容器,则定义出来的stack实际上就是对vector容器进行了包装。

栈的接口从上一篇中我们都已经知道了。所以这里直接上代码

#pragma once
#include<vector>
#include<list>
#include<deque>
namespace My_stack
{
	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();
		}
		//获取栈顶元素
		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的模拟实现

#pragma once
#include<vector>
#include<list>
#include<deque>

namespace My_Queue
{
	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();
		}
		//获取队头
		const T& front() const
		{
			return _con.front();
		}
		//获取队尾
		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)
		{
			swap(q._con);
		}
	private:
		Container _con;
	};
}

 


网站公告

今日签到

点亮在社区的每一天
去签到