0
点赞
收藏
分享

微信扫一扫

Redis实战(+)

Star英 04-13 15:30 阅读 2
c++

目录

一Stack

1介绍

2接口 

3模拟实现

4栈的oj题

 二Queue

1介绍

2接口

3模拟实现

三容器适配器

1再谈栈和队列 

四优先级队列

1接口

​编辑

2仿函数

五dequeue的简单介绍 


一Stack

1介绍

先来看看库中对栈的介绍:

2接口 

3模拟实现

#include<vector>
namespace bite
{
	template<class T>
	class stack
	{
	public:
		stack() {}
		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(); }
		size_t size()const { return _c.size(); }
		bool empty()const { return _c.empty(); }
	private:
		std::vector<T> _c;
    }
}

4栈的oj题

 二Queue

1介绍

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素:元素从队尾入队列,从队头出队列
3. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

2接口

3模拟实现

因为queue的接口中存在头删和尾插,因此使用vector来封装效率太低,故可以借助list来模拟实现

#include <list>
namespace bite
{
	template<class T>
	class queue
	{
	public:
		queue() {}
		void push(const T& x) { _c.push_back(x); }
		void pop() { _c.pop_front(); }
		T& back() { return _c.back(); }
		const T& back()const { return _c.back(); }
		T& front() { return _c.front(); }
		const T& front()const { return _c.front(); }
		size_t size()const { return _c.size(); }
		bool empty()const { return _c.empty(); }
	private:
		std::list<T> _c;
    }
}

三容器适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口
 

1再谈栈和队列 

template<class T,class Container = deque<T>>//库中给出的缺省值是deque<T>
class Stack
{
public:
	bool empty()
	{
		return _v.empty();
	}
	size_t size()
	{
		return _v.size();
	}
	const T& top()
	{
		return _v.back();
	}
	void push(const T& x)
	{
		_v.push_back(x);
	}
	void pop()
	{
		_v.pop_back();
	}
private:
	Container _v;
};

四优先级队列

1接口

 如果我们想让它打印出来是升序呢?

在模板中传类型:

 

2仿函数

3模拟实现

//适配器进行容器调用
namespace bit
{
	template<class T,class Container = deque<T>>
	class Stack
	{
	public:
		bool empty()
		{
			return _v.empty();
		}
		size_t size()
		{
			return _v.size();
		}
		const T& top()
		{
			return _v.back();
		}
		void push(const T& x)
		{
			_v.push_back(x);
		}
		void pop()
		{
			_v.pop_back();
		}
	private:
		Container _v;
	};
	
	template<class T, class Container = deque<T>>
	class Queue
	{
	public:
		bool empty()
		{
			return _l.empty();
		}
		size_t size()
		{
			return _l.size();
		}
		const T& front()
		{
			return _l.front();
		}
		const T& back()
		{
			return _l.back();
		}
		void push(const T& x)
		{
			_l.push_back(x);
		}
		void pop()
		{
			_l.pop_front();
		}
	private:
		Container _l;
	};

	template<class T>
	class greater
	{
	public:
		bool operator()(const T& x,const T& y)
		{
			return x > y;
		}
	};

	template<class T>
	class less
	{
	public:
		bool operator()(const T& x, const T& y)
		{
			return x < y;
		}
	};

	template<class T,class Container=vector<T>,class Compare = less<T>>
	class priority_queue
	{
	public:
		bool empty() const
		{
			return _pro.empty();
		}

		size_t size() const
		{
			return _pro.size();
		}

		const T& top() const
		{
			return _pro[0];
		}
		//less -> 降序 -> 建大堆(与HeapSort的逻辑不同)
		void AjustUp(size_t child)
		{
			Compare com;
			size_t parent = (child - 1) / 2;
			while (child >0)
			{
				     //_pro[parent] < _pro[child]
				if (com(_pro[parent] , _pro[child]))
				{
					swap(_pro[child], _pro[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

		void push(const T& val)
		{
			_pro.push_back(val);
			AjustUp(_pro.size()-1);
		}

		void AjustDown(size_t parent)
		{
			Compare com;
			size_t child = parent * 2 + 1;
			while (child < _pro.size())
			{
				//选最大(降序)的child与parent交换 _pro[child] <  _pro[child + 1]          
				if (child + 1<_pro.size() && com(_pro[child] , _pro[child+1]))
				{
					child++;
				}
				//      _pro[parent] < _pro[child]
				if (com(_pro[parent] , _pro[child]))
				{
					swap(_pro[child], _pro[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}

		void pop()
		{
			swap(_pro[0], _pro[_pro.size() - 1]);
			_pro.pop_back();
			AjustDown(0);
		}	
	private:
		Container _pro;

	};

 

五dequeue的简单介绍 

但deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组:


 

 

 以上便是我的学习整理,有错误欢迎在评论区里指出,感谢您的观看!!

 

 

举报

相关推荐

0 条评论