C++ stack和queue

什么是stack

stack就是平常所说的栈,栈只能进行在固定的一端插入数据和删除数据的操作,也就是先进后出,后进先出

什么是queue

queue是平常所说的队列,队列就像平常排队吃饭一样,先到的就有饭吃,只能从一端进,另一端出,也就是先入队的先出队,后入队的后出队

容器适配器

在cplusplus官网上可以看到

这里的模板都有两个,第一模板T就不必多说了,第二个是一个缺省参数container。虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器

也就是说stack和queue可以用不同的容器来实现,但是不同容器带来的复杂性也不同。在这里我们就是用默认的容器deque来模拟实现。

stack模拟实现

stack模拟实现中,由于c++的方便性,库里已经给出了我们所需要的各种函数,所以我们只需要调用使用的容器的函数即可

例如栈是先进后出,那么我们在入栈的时候就调用尾插push_back函数,出栈的时候就调用尾删pop_back函数,以此类推

namespace bear
{
	//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();
		}
		//获取栈顶元素
		T& top()
		{
			return _con.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的模拟实现中,由于队列的特性,先进的先出没,后进的后出,那么我们在入队列的时候调用尾插push_back函数,出队列的时候调用头删pop_front函数即可,依次类推

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值