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

#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;
	};
}

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值