stack和queue基本使用

news2025/1/10 23:50:34

stack和queue基本使用

  • stack
  • queue
  • priority_queue
  • stack和queue容器底层的默认容器:deque

stack

stack是一种容器适配器(容器适配器可以将一种接口转为用户需要的另一种接口,如将vector、list的接口封装转成用户需要的stack的接口),在STL中stack并没有被划分到容器的行列,数据进出方式为后进先出,只能从容器的一端插入和删除数据,如果不进行指定,其底层容器默认是deque。

template <class T, class Container = deque<T> > class stack;

在这里插入图片描述

其基本使用也比较简单:
1.构造空栈:

explicit stack (const container_type& ctnr = container_type());

2.取栈顶元素:

      value_type& top();
const value_type& top() const;

3.将元素压入栈中:

void push (const value_type& val);

4.将元素从栈中弹出:

void pop();

5.检测栈是否为空:

bool empty() const;

6.返回栈中元素个数:

size_type size() const;

7.交换两个栈

void swap (stack& x) noexcept(/*see below*/);

//Exchanges the contents of the container adaptor (*this) by those of x.
//This member function calls the non-member function swap (unqualified) to swap the underlying containers.
//The noexcept specifier matches the swap operation on the underlying container.
//将容器适配器 (*this) 的内容交换为 x 的内容。
//此成员函数调用非成员函数 swap (unqualified) 来交换基础容器。
//noexcept 说明符与基础容器上的交换操作匹配。

queue

queue也是一种容器适配器,在STL中也没有被划分到容器的行列,数据进出方式为先进先出,从容器的一端插入数据,在另一端提取数据。如果不进行指定,其底层容器默认也是deque。

template <class T, class Container = deque<T> > class queue;

在这里插入图片描述

其使用也较为简单:
1.构造空队列:

explicit queue (const container_type& ctnr = container_type());

2.返回队头元素的引用:

      value_type& front();
const value_type& front() const;

3.返回队尾元素的引用:

      value_type& back();
const value_type& back() const;

4.在队尾将元素入列:

void push (const value_type& val);

5.队头元素出列;

void pop();

6.检验队列是否为空:

bool empty() const;

7.返回队列元素个数:

size_type size() const;

8.交换两个队列:

void swap (queue& x) noexcept(/*see below*/);

//Exchanges the contents of the container adaptor (*this) by those of x.
//This member function calls the non-member function swap (unqualified) to swap the underlying containers.
//The noexcept specifier matches the swap operation on the underlying container.

priority_queue

在头文件<queue> 中,除queue外,还有一个容器适配器:priority_queue,这是一个优先级队列,可以将其当作堆来看待,其底层容器默认是vector(因为该容器其实是一个堆,所以其底层容器必须要可以用下标[ ]进行访问)。

template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> > class priority_queue;
//typename Container::value_type可以当成T看待

在这里插入图片描述
其用法依旧很简单:
1.构造空的优先级队列:

explicit priority_queue (const Compare& comp = Compare(),
                         const Container& ctnr = Container());

2.使用迭代器构造队列:

template <class InputIterator>
priority_queue (InputIterator first, InputIterator last,const Compare& comp = Compare(),const Container& ctnr = Container());

3.返回优先级队列中最大元素/最小元素(默认是最大元素),即返回堆顶元素:

const value_type& top() const;

4.在优先级队列中插入元素:

void push (const value_type& val);

5.删除优先级队列中最大元素/最小元素(默认是最大元素),即删除堆顶元素:

void pop();

6.检验优先级队列是否为空:

bool empty() const;

7.返回优先级队列元素个数;

size_type size() const;

8.交换两个优先级队列;

void swap (priority_queue& x) noexcept (/*see below*/);

//Exchanges the contents of the container adaptor by those of x, swapping both the underlying container value and their comparison function using the corresponding swap non-member functions (unqualified).
//This member function has a noexcept specifier that matches the combined noexcept of the swap operations on the underlying container and the comparison functions.

stack和queue容器底层的默认容器:deque

deque是由一小段一小段的连续空间构成的,其结构大致如下:

在这里插入图片描述
中控即指针数组从中间位置开始使用,以保证其头插头删尾删的高效性,但该结构却导致了下标访问的高效性与中间元素插入删除的高效性之间是互斥的:如果为每个指针开辟的空间大小都是相同的,那么如果需要进行下标访问时,只要简单的计算就行了,其效率可以保证,但删除和插入中间元素其效率确实极低的;如果为每个指针开辟的空间大小不同(即可以进行缩容扩容),虽然保证了中间元素删除插入的高效性,但其进行下标访问的效率就会极大下降。
总之,deque在头部插入和删除元素的效率是比vector高的,其空间利用率也比list高,其缺陷也非常明显,在遍历和中间元素插入删除效率非常低。

而stack和queue选择deque作为底层容器的原因是因为stack和queue不需要进行遍历,而且只对首尾元素进行操作,完全符合deque的优点且避开了其缺点。

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

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

相关文章

Java实现音乐平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

【Linux系统学习】6.Linux系统软件安装

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;但是并没有一些具体的实…

DP读书:《openEuler操作系统》(九)从IPC到网卡到卡驱动程序

DP读书&#xff1a;《openEuler操作系统》从IPC到网卡到卡驱动程序&#xff09; 上章回顾_SPI上节回顾_TCP 网卡驱动程序简介1.设备驱动2.总线与设备3.网卡及其抽象 驱动程序的注册与注销1. 注册2. 注销 设备初始化1. 硬件初始化2. 软件初始化 设备的打开与关闭1. 设备的打开2.…

lv14 中断处理原理:接口及按键驱动 14

一、什么是中断 一种硬件上的通知机制&#xff0c;用来通知CPU发生了某种需要立即处理的事件 分为&#xff1a; 内部中断 CPU执行程序的过程中&#xff0c;发生的一些硬件出错、运算出错事件&#xff08;如分母为0、溢出等等&#xff09;&#xff0c;不可屏蔽 外部中断 外设…

OpenAI---提示词工程的6大原则

OpenAI在官方的文档里上线了Prompt engineering&#xff0c;也就是提示词工程指南&#xff0c;其中OpenAI有提到写提示词的6条大的原则&#xff0c;它们分别是&#xff1a; &#xff08;1&#xff09;Write clear instructions&#xff08;写出清晰的指令&#xff09; &#xf…

React18原理: 再聊Fiber架构下的时间分片

时间分片 react的任务可以被打断&#xff0c;其实就是基于时间分片的人眼最高能识别的帧数不超过30帧&#xff0c;电影的帧数差不多是在24浏览器的帧率一般来说是60帧&#xff0c;也就是每秒60个画面, 平均一个画面大概是16.5毫秒左右浏览器正常的工作流程是运算渲染&#xff…

DataEase

一. DataEase (一). 说明 安装文档 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。DataEase 支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;并可以方便的与他人分…

私有化部署一个自己的网盘

效果 安装 1.创建目录 cd /opt mkdir -p kod/{db,site} cd /opt/kod 2.环境文件 vim db.env 内容如下 MYSQL_PASSWORD123456 MYSQL_DATABASEkodbox MYSQL_USERkodbox 3.编写docker-compose.yml vim docker-compose.yml 内容如下 version: 3.5services:db:image: mar…

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …

假期作业 8

1、若有以下说明语句&#xff1a;int a[12]{1,2,3,4,5,6,7,8,9,10,11,12};char c’a’,d,g;则数值为4的表达式是&#xff08; B&#xff09;。 A&#xff09;a[g-c] B&#xff09;a[4] C&#xff09;a[‘d’-‘c’] D&#xff09;a[‘d’-c] 2、假…

二、数据结构

链表 单链表 https://www.acwing.com/problem/content/828/ #include<iostream> using namespace std; const int N 1e5 10; //head:头节点的指向 e[i]:当前节点i的值 ne[i]:当前节点i的next指针 idx:当前存储的点 int head, e[N], ne[N], idx;//初始化 void i…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…

《21天精通IPv4 to IPv6》第0天:IPv4至IPv6的必要性与互联网IP资源发展趋势浅谈

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【linux系统体验】-archlinux简易折腾

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化2.4 桌面面板美化 三、常用命令 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;…

JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制

Background 内质网应激反应&#xff08;UPR&#xff09; 中的一个重要过程。UPR是由内质网中的三种跨膜传感器&#xff08;IRE1、PERK和ATF6&#xff09;控制的细胞应激反应&#xff0c;当内质网中的蛋白质折叠能力受到压力时&#xff0c;UPR通过减少蛋白质合成和增加未折叠或错…

vscode远程连接失败

目录 解决方案尝试1解决方案尝试2 解决方案尝试1 最近通过vscode一直使用腾讯云的服务器作为远程开发环境&#xff0c;以前一直很好用。 直到最近重装了系统之后&#xff0c;发现vscode没法对云服务器进行连接了&#xff0c;即使在远程主机添加了本地的公钥也不行。直接报错:…

vb.net极简版扫雷16*16,40雷源代码,仅供学习和参考

效果图&#xff1a;下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/14rrZujpQbfs-9HMw_lL-3Q?pwd1234 提取码&#xff1a;1234 源代码&#xff1a;只有120行 Imports System.Math Public Class Form1Dim Booms As New List(Of Point)Dim MyBooms As New List…

推荐系统|物品冷启动01_优化目标评价(包括基尼系数)

文章目录 物品冷启动冷启动的类型“新”按常规推送链路的角度按产品生态角度 物品冷启动的目标和评价指标作者侧用户侧 冷启动的衡量 物品冷启动 冷启动的类型 冷启动的内容种类包括很多方面&#xff0c;本文只介绍UGC的冷启动。 所谓UGC&#xff0c;就是User Generate Conte…

leetcode(二分查找)35.搜索插入位置(C++详细解释)DAY6

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

利用YOLOv8 pose estimation 进行 人的 头部等马赛克

文章大纲 马赛克几种OpenCV 实现马赛克的方法高斯模糊pose estimation 定位并模糊:三角形的外接圆与膨胀系数实现实现代码实现效果参考文献与学习路径之前写过一个文章记录,怎么对人进行目标检测后打码,但是人脸识别有个问题是,很多人的背影,或者侧面无法识别出来人脸,那…