前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >stack,queue,priority_queue的模拟实现,适配器deque

stack,queue,priority_queue的模拟实现,适配器deque

作者头像
code-child
发布2023-05-30 14:23:00
1580
发布2023-05-30 14:23:00
举报
文章被收录于专栏:codechild

在我们模拟实现stack,queue的时候,我们会用deque作为默认的适配器

那么deque的底层是什么呢?可以说是一个指针数组,当然该数组是动态的,它有一个中控指针,中控指针指向首元素的所在的那一行buffer数组,对于改数据结构,我们支持随机访问,如果有频繁的头插(删)和尾插(删),选择该结构还是不错的。

stack的模拟实现

代码语言:javascript
复制
cpp	template<class T,class Container=deque<T>>
	class stack
	{
		Container c;
	public:
		void push(const T& x)
		{
			c.push_back(x);
		}
		void pop()
		{
			c.pop_back();
		}
		T& top()
		{
			return c.back();
		}
		const T& top()const
		{
			return c.back();
		}
		bool empty()
		{
			return c.empty();
		}
		size_t size()const
		{
			return c.size();
		}
	};

queue

代码语言:javascript
复制
cpp	template<class T,class Container=deque<T>>
	class queue
	{
		Container c;
	public:
		void push(const T& x)
		{
			c.push_back(x);
		}
		void pop()
		{
			c.pop_front();
		}
		bool empty()
		{
			return c.empty();
		}
		size_t size()const
		{
			return c.szie();
		}
		T& back()
		{
			return c.back();
		}
		const T& back()const
		{
			return c.back();
		}
		T& front()
		{
			return c.front();
		}
		const T& front()const
		{
			return c.front();
		}
	};

priority_queue的模拟实现

priority_queue为优先级队列,它的底层是用堆来实现的,默认用的vector容器来实现的,

代码语言:javascript
复制
cpp	template<class T,class Container=vector<T>,class Compara=less<T>>
	class priority_queue
	{
		Container c;
	public:
		priority_queue(){}
		template<class iterator>
		priority_queue(iterator first, iterator last)
		{
			while (first != last)
			{
				c.push_back(*first);
				++first;
			}

			for (size_t i = (c.szie() - 1-1)/2; i >= 0; i--)
			{
				adjust_down(i);
			}
		}
		void push(const T& x)
		{
			c.push_back(x);
			adjust_up(c.size()-1);
		}
		void pop()
		{
			std::swap(c[0], c[c.size() - 1]);
			c.pop_back();
			adjust_down(0);
		}
		void adjust_up(size_t child)//大堆
		{
			Compara com;
			size_t father = (child - 1) / 2;
			while (child>0)
			{
				if (com(c[father] ,c[child]))
				{
					std::swap(c[father], c[child]);
					child = father;
					father= (child - 1) / 2;
				}
				else
					break;
			}
		}
		void adjust_down(size_t father)//大堆
		{
			Compara com;
			size_t child = 2 * father + 1;
			if (child + 1 < c.size())
			{
				if (com(c[child] , c[child+1]))
					child += 1;
			}
			while (child<c.size())
			{
				if (com(c[father], c[child]))
				{
					std::swap(c[father], c[child]);
					father = child;
					child= 2 * father + 1;
				}
				else
					break;
			}
		}
		size_t size()
		{
			return c.size();
		}
		T& top()
		{
			return c[0];
		}
		const T& top()const
		{
			return c[0];
		}
		bool empty()
		{
			return c.empty();
		}
	};
	//下面为仿函数
	template<class T>
	class less
	{
	public:
		bool operator()(const T& a,const T& b)
		{
			return a < b;
		}
	};
	template<class T>
	class great
	{
	public:
		bool operator()(const T& a, const T& b)
		{
			return a > b;
		}
	};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-26c,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • stack的模拟实现
  • queue
  • priority_queue的模拟实现
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档