C++stack_queue

stack_queue

容器适配器

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack(栈),queue(队列),priority_queue(优先队列)。适配器是标准库中的一个通用概念。容器,迭代器和函数都有适配器。本质上一个适配器是一种机制,能使某种事物的行为看起来像另外一种事情一样。一个适配器接受一种已有的容器类型。使其行为看起来像一种不同的类型。

默认情况下,stack和queue是基于deque(双端队列)实现的,priority_queue是再vector之上实现的。

C++ 复制代码
template <class T, class Container = deque<T> > class stack;
template <class T, class Container = deque<T> > class queue;
template <class T, class Container = vector<T>,
  class Compare = less<typename Container::value_type> > class priority_queue;

我们可以再创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认的容器类型。

C++ 复制代码
stack<int,vector<int>> stk;
stack<int,list<int>> stk;
queue<int,vector<int>> q;

对一个给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造再array之上。

stack只要求push_back,pop_back,back操作,可以使用除array和forward_list之外的任何容器类型来构造stack。

queue适配器要求back,push_back,front,push_front,因此它的构造可以构造于list,deque之上,但是不能用vector,因为vector没有push_front等函数,但自己模拟实现的时候,强行用vector也是可以实现的。

priority_queue除了front,push_back,pop_back操作之外,还要求随机访问能力,因此它可以再vector和deque的基础上构造,但不能用list,list不支持随机访问。

stack详解

栈适配器

stack类型定义再stack头文件中,栈所支持的操作不算太多,再之前的数据结构中模拟实现栈的时候,大部分函数已经实现。

C++ 复制代码
	std::stack<int> stk;//空栈
	stk.push(1);//压栈
	stk.push(2);
	stk.push(3);
	stk.push(4);

	while (!stk.empty()/*判断栈是否为空*/)
	{
		std::cout << stk.top() << ' ';//输出栈顶元素
		stk.pop();//出栈
	}

每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作,我们只可以使用适配器操作,而不能使用底层容器类型的操作。

栈模拟实现

C++ 复制代码
namespace HaiFan
{
	template <class T, class Container = deque<T> > 
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		T top()
		{
			return _con.back();
		}

		bool empty()
		{
			return _con.empty();
		}

		void pop()
		{
			_con.pop_back();
		}

		size_t size()
		{
			return _con.size();
		}

		void swap(stack<T>& it)
		{
			_con.swap(it._con);
		}
		//swap函数交换的是容器对象,而不是it本身,所以再模拟实现按的时候要注意一下,否则会出现类型不匹配的报错。
	private:
		Container _con;
	};
}

队列详解

队列适配器

queue和priority_queue适配器定义再queue头文件中。

queue

priority_queue

标准库queue使用一种先进先出的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。

priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比他低的已有元素之前。

queue的用法很简单,empty判空,size队列大小,front队首元素,back队尾元素,push入队,pop出队。


优先队列其实是一个堆

C++ 复制代码
	priority_queue<int, vector<int>, greater<int>> q;
	//greater小根堆,less大根堆
	q.push(1);
	q.push(-1);
	q.push(100);
	q.push(120);
	q.push(10);
	
	while (q.size())
	{
		cout << q.top() << ' ';
		q.pop();
	}

queue模拟实现

C++ 复制代码
#pragma once

#include <deque>

namespace HaiFan
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

		T front()
		{
			return _con.front();
		}

		T back()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}

	private:
		Container _con;
	};
}
相关推荐
2601_962106643 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
科技苑3 小时前
C++ CAS与ABA问题详解,无锁编程的经典陷阱怎么解决?
c++·人工智能
RuoyiOffice4 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106644 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
czq_26867194874 小时前
Python打卡第46天
开发语言·python
杨凯凡5 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard5 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android5 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤5 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J7 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波