栈、队列、优先级队列详解【c++】

news2024/11/28 12:51:08

在这里插入图片描述


目录

  • 🏀stack的介绍和使用
    • ⚽stack的介绍
    • ⚽stack的使用
  • 🏀queue的介绍和使用
    • ⚽queue的介绍
    • ⚽queue的使用
  • 🏀priority_queue的介绍和使用
    • ⚽priority_queue的介绍
    • ⚽priority_queue的使用
  • 🏀总结


🏀stack的介绍和使用

⚽stack的介绍

stack是一种容器适配器,它专门用于实现后进先出(LIFO)的数据结构。stack是通过封装底层容器的方式实现的,它提供了一组特定的成员函数来访问其元素,将元素作为其底层容器的尾部(即栈顶)被压入和弹出。

stack的底层容器可以是任何标准的容器类模板或其他特定的容器类,这些容器类应该支持以下操作:

  1. empty:判空操作
  2. back:获取尾部元素操作
  3. push_back:尾部插入元素操作
  4. pop_back:尾部删除元素操作

在这里插入图片描述

标准容器vector、deque、list均符合这些需求。如果没有为stack指定特定的底层容器,默认情况下将使用deque作为底层容器。

⚽stack的使用

栈是一种常见的数据结构,它是一种后进先出(LIFO)的数据结构,即最后进入的元素最先被访问。栈通常用于函数调用、表达式求值、括号匹配、迷宫问题等场景中。

stack给我们提供了以下几个函数:

函数说明接口说明
stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将stack中尾部的元素弹出

示例代码:

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    // 创建一个空的栈
    stack<int> s;
    // 检查栈是否为空
    if (s.empty())
    {
        cout << "栈为空" << endl;
    }
    // 将元素压入栈中
    s.push(1);
    s.push(2);
    s.push(3);
    // 获取栈中元素的数量
    cout << "栈中元素的数量为:" << s.size() << endl;
    // 获取栈顶元素的引用
    cout << "栈顶元素为:" << s.top() << endl;
    // 弹出栈顶元素
    s.pop();
    cout << "弹出栈顶元素" << endl;
    // 获取栈中元素的数量
    cout << "栈中元素的数量为:" << s.size() << endl;
    // 再次获取栈顶元素的引用
    cout << "栈顶元素为:" << s.top() << endl;
    return 0;
}

运行结果:

在这里插入图片描述

在使用stack时,需要注意以下几点:

  1. 栈是一种后进先出(LIFO)的数据结构。
  2. 在使用栈之前,需要包含头文件。
  3. stack模板类只能存储相同类型的元素。
  4. 当栈为空时,调用top()函数会导致未定义的行为。

🏀queue的介绍和使用

⚽queue的介绍

队列(Queue)是一种常用的数据结构,它遵循先进先出(First In First Out,FIFO)的原则,即先进入队列的元素先出队列。队列可以用于实现很多算法和数据结构,例如广度优先搜索和缓存等。在C++中,可以使用STL中的queue容器适配器来实现队列。

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

底层容器可以是标准容器类模板之一,例如deque和list,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:

  • empty():检测队列是否为空。
  • size():返回队列中有效元素的个数。
  • front():返回队头元素的引用。
  • back():返回队尾元素的引用。
  • push_back(const T& obj):在队列尾部插入元素obj。
  • pop_front():在队列头部弹出元素。

在这里插入图片描述

默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

⚽queue的使用

使用queue非常简单,只需要先创建一个queue对象,然后使用push()方法向队列中添加元素,使用pop()方法从队列中删除元素,使用front()和back()方法获取队头和队尾元素的引用。以下是queue提供给我们的一些函数方法。

函数声明接口说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列

示例代码:

#include <iostream>
#include <queue>
using namespace std;

int main() {
    queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);
    cout << "队列大小:" << q.size() << endl;  
    cout << "队头元素:" << q.front() << endl;  
    cout << "队尾元素:" << q.back() << endl;  
    q.pop();
    cout << "删除队头元素后,队列大小:" << q.size() << endl; 
    cout << "新的队头元素:" << q.front() << endl;  
    return 0;
}

运行代码:

在这里插入图片描述

queue使用的注意事项:

  1. 使用前需要包含头文件。
  2. queue是一种FIFO(先进先出)的数据结构,只能在队列的末尾添加元素,在队列的头部删除元素。
  3. queue的底层实现可以是deque或list,因此可以根据需要选择适合的底层实现。默认情况下,使用deque作为底层实现。
  4. queue的成员函数empty()、size()、front()、back()、push()、pop()的时间复杂度均为O(1)。
  5. 使用front()和back()方法获取队头和队尾元素的引用时,需要先判断队列是否为空,否则会导致程序崩溃。
  6. 在使用自定义类型作为queue的元素时,需要重载运算符<,以便queue可以比较元素大小,从而实现排序。

🏀priority_queue的介绍和使用

⚽priority_queue的介绍

优先队列(Priority Queue)是一种容器适配器,它根据严格的弱排序标准,使得优先队列的第一个元素总是它所包含的元素中最大的。在优先队列中,可以随时插入元素,但只能检索最大元素(优先队列中位于顶部的元素)。

在C++中,优先队列被实现为容器适配器,它可以将特定容器类封装作为其底层容器类,并提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

底层容器可以是任何标准容器类模板,例如vector和deque,也可以是其他特定设计的容器类。该容器应该可以通过随机访问迭代器访问,并支持以下操作:

  • empty():检测容器是否为空。
  • size():返回容器中有效元素的个数。
  • front():返回容器中第一个元素的引用。
  • push_back(const T& obj):在容器尾部插入元素obj。
  • pop_back():删除容器尾部元素。

需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数make_heap、push_heap和pop_heap来自动完成此操作。

默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。

⚽priority_queue的使用

优先队列(Priority Queue)默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构。因此,priority_queue本质上就是一个堆,可以用于需要使用堆的位置。

默认情况下,priority_queue是大堆(即最大堆),即优先队列中的第一个元素总是最大的。如果需要使用最小堆,可以通过指定比较函数来实现。

priority_queue提供了以下常用操作:

函数说明
priority_queue()构造一个空的优先级队列。
priority_queue(first, last)构造一个空的优先级队列。
empty()检测优先级队列是否为空,是返回true,否则返回false。
top()返回优先级队列中最大(最小)元素,即堆顶元素。
push(x)在优先级队列中插入元素x。
pop()删除优先级队列中最大(最小)元素,即堆顶元素。

示例代码:

#include <iostream>
#include <queue>
using namespace std;

int main() {
    priority_queue<int> pq;
    pq.push(3);
    pq.push(1);
    pq.push(4);
    pq.push(1);
    cout << "堆顶元素:" << pq.top() << endl;  
    pq.pop();
    cout << "删除堆顶元素后,新的堆顶元素:" << pq.top() << endl;  
    return 0;
}

运行结果:

在这里插入图片描述

如果需要使用最小堆,可以通过指定比较函数来实现。例如,以下代码演示了如何创建一个最小堆:

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int, vector<int>, greater<int>> minHeap;
    minHeap.push(3);
    minHeap.push(1);
    minHeap.push(4);
    minHeap.push(1);
    cout << "堆顶元素:" << minHeap.top() << endl;
    minHeap.pop();
    cout << "删除堆顶元素后,新的堆顶元素:" << minHeap.top() << endl;
    return 0;
}

运行结果:
在这里插入图片描述

以下是使用priority_queue时需要注意的事项:

  1. 使用前需要包含头文件<queue>
  2. 默认情况下,priority_queue是最大堆,即最大的元素总是位于队列的最前面。如果需要使用最小堆,可以通过指定比较函数来实现。
  3. priority_queue的底层实现是堆,因此可以用于实现最大堆或最小堆。堆是一种特殊的二叉树,具有以下性质:
  • 堆是一棵完全二叉树。
  • 堆中每个节点的值都大于等于(或小于等于)其子节点的值。

🏀总结

本篇博客对c++的stack,queue和priority_queue的介绍和使用进行了阐述,以上三种容器的使用都十分简单,只需要调用相应的方法即可。需要注意的是,使用这些容器时,需要注意线程安全问题、内存管理问题和异常处理问题。

此外,C++还提供了其他的容器,如vector、list、map等,不同的容器适用于不同的场景,开发者需要根据具体的需求选择合适的容器。

到此为止,如果觉得本篇文章对你有帮助的话就请点一个小小的👍吧,你的鼓励就是我的动力。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尝试-InsCode Stable Diffusion 美图活动一期

一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 活动地址 三、图片生成提示词与反向提示词&#xff1a; 提示词&#xff1a;realistic portrait painting of a japanese…

OPENMV的形状和颜色组合识别

使用openmv&#xff0c;通过阈值颜色和形状来去真假宝藏。调试过程发现颜色的阈值比较重要&#xff0c;因为不准的话&#xff0c;它会把一些颜色相近的物体也识别了。识别的精度有待提高&#xff0c;可以使用YOLOV5来精确识别&#xff0c;奈何本人没精力来弄这个。 打开机器视觉…

Proxmox VE 为 Windows 虚拟机添加硬盘遇到的问题

环境&#xff1a;PVE 8.x、Windows 11/Windows Server 2019 &#x1f449;问题一&#xff1a; 为 windows 虚拟机添加磁盘&#xff0c;重启虚拟机后&#xff08;在 windows 系统中重启&#xff09;磁盘未能生效&#xff0c;并显示为橘色。 ❗橘色 意味需要重启VM才能生效&…

BIO实战、NIO编程与直接内存、零拷贝深入辨析-02

网络通信编程基本常识 什么是 Socket &#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。在设计模式中&#xff0c;Socket 其实就是一个门面模式&#xff0c;它把复杂的 TCP/IP 协议处理和…

RocketMQ学习笔记(基础篇)

目录 RocketMQ简介 单Master模式 多Master模式 多Master多Slave模式&#xff08;异步&#xff09; 多Master多Slave模式&#xff08;同步&#xff09; 双主双从集群 事务消息 事务消息发送及提交 事务补偿 事务消息状态 RocketMQ高级功能 消息存储 存储介质 消息的…

vue upload 下载

目录 上传 下载 get post 对象/文件流 download处理返回 文件流 axios.post 封装axios 后端直接返回文件流&#xff0c;打开下载文件是 [object Object]&#xff0c;将res改成res.data即可 1.请求设置类型responseType: blob&#xff08;如果没有设置&#xff0c;打…

14_Linux设备树下的platform驱动编写

目录 设备树下的platform驱动简介 运行测试 设备树下的platform驱动简介 platform驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理&#xff0c;这个是Linux内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。在没有设备树的Linux内…

1770_VirtualBox下安装Debian

全部学习汇总&#xff1a; GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 作为我自己的日常使用&#xff0c;Debian基本上没有出现过。最多是让它运行在某个设备上作为一个服务的平台&#xff0c;因为很多东西我懒得去配置。 Debia…

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

模版模式在Spring中的应用

前言 模式模式在Spring中的应用较多&#xff0c;这里结合JdbcTemplate的源码来和大家一起学习下&#xff0c;更加深刻滴认识下模版模式&#xff0c;以便在日常开发中&#xff0c;能灵活运用模版模式&#xff0c;来减少重复代码&#xff0c;增强代码的可拓展性。 何为模版模式…

Python学习(七)

#字典 #字典的定义&#xff0c;同样是使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对。如下语法&#xff1a; my_dict{"周杰伦":99,"林俊杰":99} print(f"字典的内容是&#xff1a;{my_dict},类型是&#xff1a;{type(my_dict)}"…

Vue条件渲染

v-if 和 v-show <body> <div id"root"><!--用v-show做条件渲染--> <!-- <h2 v-show"false">欢迎来到{{name}}</h2>--><!--使用v-if做条件渲染--><h2 v-if"false">欢迎来到{{name}}</h2&g…

一文读懂STM32芯片总线

目录 一、前言 二、总线基础知识概述 (1)、总线在芯片中的角色 (2)、总线的类型 (3)、总线的指标 (4)、AHB和APB 三、总线框架结构 (1)、结构类型 (2)、总线模块 (3)、总线交互 四、总结 一、前言 本篇介绍STM32芯片内部的总线系统结构&#xff0c;嵌入式芯片内部的…

C++11左值和右值、左值引用和右值引用浅析

从字面意思来讲&#xff0c;左值就是“能用在赋值语句等号左侧的内容&#xff08;它得代表一个地址&#xff09;”&#xff1b;右值就是不能作为左值的值&#xff0c;即右值不能出现在赋值语句中等号的左侧。C中的一条表达式&#xff0c;要么就是右值&#xff0c;要么就是左值&…

钉钉监控Hippo4j线程池通知报警

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

软考03海明校验码

文章目录 前言一、练习一二、练习二总结 前言 海明校验码可以用来纠正错误 公式&#xff1a; 2k-1≥nk n为数据位&#xff0c;k为校验位 编码规则&#xff1a;校验位为2的次方&#xff0c;其他为数据位。 一、练习一 数据位为4&#xff0c;校验位最小为多少位&#xff1f; 答&…

《微服务架构设计模式》第十二章 部署微服务应用

内容总结自《微服务架构设计模式》 部署微服务应用 一、部署模式分类二、编程语言特定的发布包格式1、概述2、利弊 三、将服务部署为虚拟机1、概览2、利弊 四、将服务部署为容器1、概述2、利弊3、K8S部署 五、Serverless部署1、概述2、利弊3、示例 六、总结 一、部署模式分类 …

计算机丢失msvcp140.dll是什么意思?哪个修复方法更推荐

打开photoshop软件的时候&#xff0c;计算报错丢失msvcp140.dll是什么意思&#xff1f;软件也无法正常启动运行&#xff0c;这个主要的原因就是电脑系统中的msvcp140.dll文件丢失或者损坏了&#xff0c;运行需要该文件的程序或应用程序时&#xff0c;操作系统无法找到该特定的动…

低代码都做了什么?怎么实现 Low-Code?

前言 低代码的概念早在很多很多年前就已经出现了&#xff0c;比如最早期的Dreamweaver 1.0&#xff0c;使用这种可视化编辑工具根本不需要投入较高的学习成本就可以轻松实现一个Web页面。而低代码最大的初衷也正是让开发者或用户减少编码时间&#xff0c;从而把更多的时间和精力…

Python应用实例(二)数据可视化(五)

数据可视化&#xff08;五&#xff09;制作全球地震散点图&#xff1a;JSON格式 1.地震数据2.查看JSON数据3.创建地震列表4.提取震级5.提取位置数据6.绘制震级散点图7.另一种指定图表数据的方式 下载一个数据集&#xff0c;其中记录了一个月内全球发生的所有地震&#xff0c;再…