C++stack和queue

系列文章目录

C++入门

C++类和对象(上)

C++类和对象(中)

C++类和对象(下)

C/C++内存管理

C++string类

C++vector类

C++list类



一、stack是什么?

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

二、stack的使用

函数说明接口说明
stack()构造函数不传参数构造一个空栈
empty()判空
size()返回元素个数
top()返回栈顶元素
push()压栈
pop()出栈

三、queue是什么?

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。

2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

四、queue的使用

函数声明接口说明
queue()构造函数
empty()判空
size()返回元素个数
front()返回队头元素
back()返回队尾元素
push()入队
pop()出队

五、优先级队列

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。

3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

其实优先级队列就是堆。

六、优先级队列的使用

函数声明接口说明
priority_queue()构造函数
empty()判空
top()返回优先级队列中最大或最小元素,即堆顶元素
push()入队
pop()最大或最小元素出队, 即堆顶元素
#include <vector>
#include <queue>
#include <functional> // greater算法的头文件
void TestPriorityQueue()
{
    // 默认情况下,创建的是大堆,其底层按照小于号比较
     vector<int> v{3,2,7,6,0,4,1,9,8,5};
    priority_queue<int> q1;
    for (auto& e : v)
     q1.push(e);
    cout << q1.top() << endl;
    
     // 如果要创建小堆,将第三个模板参数换成greater比较方式
     priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
     cout << q2.top() << endl;
}

这段代码的倒数第二行好像很复杂,我们来仔细分析一下:
在这里插入图片描述
上图是优先级队列的模板参数,第一个参数是类型, 第二个参数是容器适配器,第三个参数是仿函数。

给大家进行一个简单的说明,容器适配器可以自己选定已有的容器。比如我定义一个类,第一个实例化用vector比较合适我就vector,但是第二个实例化用list更好,我就可以传list.

仿函数其实是一个类的成员函数的重载,必须实例化出一个对象才能使用。如下:

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

这个类中重载了()操作符。

template<class T, class Container = std::vector<T>, class Compare = less<typename Container::value_type>>
	class priority_queue
	{
	public:
		//大根堆
		void adjustUp()
		{
			Compare com;  //使用仿函数前要先实例化出一个对象
			size_t child = _con.size() - 1;
			size_t parents = (child - 1) >> 1;
			while (child > 0)
			{
				if (com(_con[parents], _con[child]))
				{
					std::swap(_con[child], _con[parents]);
					child = parents;
					parents = (child - 1) >> 1;
				}
				else
				{
					break;
				}
			}
		}

以上是模拟实现优先级队列的一部分,可以看到,使用仿函数前要先实例化出一个对象。同时,如果对第一行模板参数中的关键字typename不了解的可以看这篇文章:typename前缀


  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值