C++适配器 priority_queue && queue && stack 模拟实现(初阶)

本文介绍了C++中基于`vector`和`deque`的`priority_queue`(优先队列)、`stack`(栈)和`queue`(队列)模板类,展示了它们的基本操作方法,如`push`,`pop`,`top`,`empty`和`size`。
#pragma once
#include<vector>
using std::vector;
using std::swap;
namespace sxh_priority_queue
{
	template<typename T>
	struct less
	{
		bool operator()(const T& a, const T& b)
		{
			return a < b;
		}
	};
	template<typename T>
	struct greater
	{
		bool operator()(const T& a, const T& b)
		{
			return a > b;
		}
	};
	template<typename T,typename container = vector<T>, typename compare = greater<T>>
	class priority_queue
	{
	public:
		void Adjustup(int child)
		{
			int father = (child - 1) / 2;
			while (child > 0)
			{
				if (compare()(child, father))
				{
					std::swap(_con[father], _con[child]);
					child = father;
					father = (child - 1) / 2;
				}
				else
				{
					break;
				}
			};

		}
		void push(const T& x)
		{
			_con.push_back(x);
			int child = _con.size() - 1;
			Adjustup(child);
		}
		void Adjustdown(int root)
		{
			int child = (root * 2) + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && compare()(_con[child + 1], _con[child]))
				{
					child++;
				}
				if (compare()(child, root))
				{
					std::swap(_con[child], _con[root]);
					root = child;
					child = (root * 2) + 1;
				}
				else
				{
					break;
				}
			}
		}
		void pop()
		{
			int child = _con.size() - 1;
			std::swap(_con[0], child);
			_con.pop_back();
			Adjustdown(0);
		}
		const T& top()
		{
			return _con.front();
		}
		size_t size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}

	private:
		container _con;
	};
}

///////////////////////////////////////////////////////

#pragma once
#include"my_vector.h"
#include<deque>
using namespace sxh_vector;
namespace sxh_stack
{
	template<typename T,typename Container = deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			sta.push_back(x);
		}
		void pop()
		{
			sta.pop_back();
		}
		const T& top()const
		{
			return sta.back();
		}
		T& top()
		{
			return sta.back();
		}
		bool empty()
		{
			sta.empty();
		}
		size_t size()
		{
			return sta.size();
		}
	private:
		Container sta;
	};
}

//////////////////////////////////////////

#pragma once
#include<deque>
using std::deque;
namespace sxh_stack
{
	template<typename T, typename Container = deque<T>>
	class queue
	{
	public:

		void push(const T& x)
		{
			que.push_back(x);
		}
		void pop()
		{
			que.pop_front();
		}
		const T& front()const
		{
			return que.front();
		}
		T& front()
		{
			return que.front();
		}
		const T& back()const
		{
			return que.back();
		}
		T& back()
		{
			return que.back();
		}
		bool empty()
		{
			que.empty();
		}
		size_t size()
		{
			return que.size();
		}
	private:
		Container que;
	};
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值