栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++stack和queue

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++stack和queue

系列文章目录

C++入门

C++类和对象(上)

C++类和对象(中)

C++类和对象(下)

C/C++内存管理

C++string类

C++vector类

C++list类


文章目录
  • 系列文章目录
  • 一、stack是什么?
  • 二、stack的使用
  • 三、queue是什么?
  • 四、queue的使用
  • 五、优先级队列
  • 六、优先级队列的使用


一、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 
#include 
#include  // greater算法的头文件
void TestPriorityQueue()
{
    // 默认情况下,创建的是大堆,其底层按照小于号比较
     vector v{3,2,7,6,0,4,1,9,8,5};
    priority_queue q1;
    for (auto& e : v)
     q1.push(e);
    cout << q1.top() << endl;
    
     // 如果要创建小堆,将第三个模板参数换成greater比较方式
     priority_queue, greater> q2(v.begin(), v.end());
     cout << q2.top() << endl;
}

这段代码的倒数第二行好像很复杂,我们来仔细分析一下:

上图是优先级队列的模板参数,第一个参数是类型, 第二个参数是容器适配器,第三个参数是仿函数。

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

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

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

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

template, class Compare = less>
	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前缀


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号