stack 和 queue容器的介绍和使用
1.stack的介绍
1.1stack容器的介绍
stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了,还不了解的uu, 可以移步去看这篇博客哟:
- 数据结构-栈
- 数据结构-队列

简单回顾一下,重要的概念其实就是后进先出,栈在实际的工程中有着广泛的用途·,所以在c++的stl库中自然也有它的身影。
1.2 stack的使用
| 函数说明 | 接口说明 |
|---|---|
| stack | 构造空的栈 |
| empty | 检测stack是否为空 |
| size | 查看栈中元素的数量 |
| top | 获取栈顶元素 |
| push | 将元素压入栈中 |
| pop | 将栈顶元素删除 |
常用的接口基本是哪个就是上面的这些,现在我们万层下面的练习题来熟练stl库中的stack容器。
1.2.1 最小栈
题目链接

这道题目非常的特殊,这道题目就是需要我们自己来设计函数接口,来满足题目所需:
这都啊题目需要我们实现一个可以在常数时间内锁定stack中最小元素的Minstack类:
class MinStack {
public:MinStack() {}void push(int val) {}void pop() {}int top() {}int getMin() {}
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/
现在我们要实现下面的接口,其实这道题目也并不复杂,我们只需要定义两个栈
- 一个栈用于记录此时栈中所有的元素
- 一个用于记录栈中所有的元素
1.关于怎么来记录此时容器中最小的元素,我们就只需要在元素入栈的时候进行比较就可以实现
2. 只要遇到比记录最小值栈的栈顶元素小的元素,我们就直接让其成为栈顶
有了基本的思路后大家可以自己尝试一下这道题目 😛:
好了,相信大家已经做出来了,现在我们就来展示一下答案吧:🌈
class MinStack {
public:MinStack() {}void push(int val) {//注意:这里一定是小于等于,在st种可能存在多个最小值if (_min.empty() || val <= _min.top()) _min.push(val);st.push(val);}void pop() {if (st.top() == _min.top()) _min.pop();st.pop();}int top() {return st.top();}int getMin() {return _min.top();}
private:stack<int> st;stack<int> _min;
};

1.2.2 栈的弹出压入序列
题目链接

这都题目就是需要我们根据栈的后进先出的特性来进行判断,其实在了解了stack的基本特性后也是十分的简单的, 接下来我就直接展示代码了:
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pushV int整型vector * @param popV int整型vector * @return bool布尔型*/bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {// write code hereif (pushV.size() != popV.size() ) return false;int n = pushV.size();int out = 0, in = 0;stack<int> s;while (out < n){while (s.empty() || s.top() != popV[out]){if (out < n)s.push(pushV[in++]);else return false;}s.pop();out++;}if (!s.empty()) return false;;return true;}
};
完成了上面的题目相信大家都已经对stack容器的使用很熟悉了,那我们就进入queue的学习了 😛
2. queue容器的介绍和学习

队列(queue)系那个寻大家爱都已对此十分的熟悉了,大家在学习之前也可以先来阅读以下下面的这篇文档哈 🌈 🌈
和stack一样,在stl中我们也可以直接使用他提供的众多接口,下面就是我们常用的一些接口:
2.1 queue接口介绍
| 函数声明 | 接口说明 |
|---|---|
| queue | 构造空的队列 |
| empty | 检测队列是否为空,是返回true, 否则返回false |
| size | 返回队列中的元素 |
| front | 返回对头元素的引用 |
| back | 返回队尾元素的引用 |
| push | 在队尾将元素val插入队列 |
| pop | 将对头元素出队列 |
2.2 queue相关的题目
为了熟悉上那面的接口,我们还是通过练习下面的题目来巩固我们的学习:
2.2.1 用队列实现栈
题目链接

这道题目还是十分简单的,我们知道了 stack 和 queue对于数据的存取顺序的区别,需要使得后面插入的元素在队列的前端 :
现在大家可以在得到提示后可以先舱室自己做一下哈,下面我就直接展示代码了:
class MyStack {
public:
queue<int> qu;MyStack() {}void push(int x) {int n = qu.size();qu.push(x);while (n--){int t = qu.front();qu.pop();qu.push(t);}}int pop(){int a = qu.front();qu.pop();return a;}int top() {return qu.front();}bool empty() {return qu.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

3. priority_queue的介绍和使用
3.1priority_queue的介绍
介绍文档
介绍:
- 优先队列是一种容器适配器,更具严格的弱排序标准,他的第一个元素总是它所包含元素的中的最大值
- 类似于堆, 在堆中随时插入元素,并且只能检索最大的堆中元素 (优先队列中位于顶部的元素)
- 优先队列被实现为容器适配器,容器适配器即将特定的容器封装为其底层的容器类,queue提供的一组特定的成员函数来访问其元素。元素从特定的容器“尾部”弹出,其被称为优先队列的顶部
- 底层的容器可以是任何标准的类模板,也可以是其他特定的设计类模板。容器应该可以通过随机访问迭代器访问,并支持以下的操作:
- empty():检测容器是否为空
- size():返回容器中有效元素个数
- front():返回容器中第一个元素的引用
- push_back():在容器尾部插入元素
- pop_back():删除容器尾部元素
- 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue
类实例化指定容器类,则使用vector。 - 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用
算法函数make_heap、push_heap和pop_heap来自动完成此操作。
3.2 priority_queue的使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中
元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用
priority_queue。注意:默认情况下priority_queue是大堆。
3.2.1 常用接口的介绍
| 函数声明 | 接口说明 |
|---|---|
| priority_queue()/priority_queue(first,last) | 构造一个空的优先级队列 |
| empty( ) | 检测优先级队列是否为空,是返回true,否则返回false |
| top( ) | 返回优先级队列中最大(最小元素),即堆顶元素 |
| push(x) | 在优先级队列中插入元素x |
| pop() | 删除优先级队列中最大(最小)元素,即堆顶元素 |
注意:在默认情况下,priority_queue就是大堆, 想要将其改为小堆需要一个greater<T>的类模板
#include <vector>
#include <queue>
#include<iostream>
using namespace std;
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;
}int main()
{TestPriorityQueue();return 0;
}
总而言之,priority_queue就像是我们再数据结构中学到的堆的具体应用,现在我们就还是通过题目来熟练使用stl的优先队列吧 ✈️
3.3 priority_queue在OJ题目中的应用
数组中的第K个大的元素

题目中要求我们使用O(N)的时间复杂度来解决这个问题,因此我们不能直接对数组进行排序,然后直接找对应位置的元素,因为快速排序的时间复杂度是Nlog(N)
因此我们就需要用到我们刚学习的容器来解决这个问题了,其实也十分的简单,大家:自己尝试着做
class Solution {
public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int, vector<int>, greater<int>> q;for (auto& x : nums){q.push(x);if (q.size() > k) q.pop();}return q.top();}
};
这样我们看就可以以O(N)的时间复杂度完成这道题目了!!

注: 使用priority_queue不是这道题最优的解法,大家可以下去自己探索哈 😛
相关文章:
stack 和 queue容器的介绍和使用
1.stack的介绍 1.1stack容器的介绍 stack容器的基本特征和功能我们在数据结构篇就已经详细介绍了,还不了解的uu, 可以移步去看这篇博客哟: 数据结构-栈数据结构-队列 简单回顾一下,重要的概念其实就是后进先出,栈在…...
云计算与虚拟化技术讲解视频分享
互联网各领域资料分享专区(不定期更新): Sheet 前言 由于内容较多,且不便于排版,为避免资源失效,请用手机点击链接进行保存,若链接生效请及时反馈,谢谢~ 正文 链接如下(为避免资源失效&#x…...
python flask 使用 redis写一个例子
下面是一个使用Flask和Redis的简单例子: from flask import Flask from redis import Redisapp Flask(__name__) redis Redis(hostlocalhost, port6379)app.route(/) def hello():# 写入到Redisredis.set(name, Flask Redis Example)# 从Redis中读取数据name re…...
深入解析 Linux 内核内存管理核心:mm/memory.c
在 Linux 内核的众多组件中,内存管理模块是系统性能和稳定性的关键。mm/memory.c 文件作为内存管理的核心实现,承载着页面故障处理、页面表管理、内存区域映射与取消映射等重要功能。本文将深入探讨 mm/memory.c 的设计思想、关键机制以及其在内核中的作用,帮助读者更好地理…...
跟我学C++中级篇——64位的处理
一、计算机的发展 计算机从二进制为基础开始描述整个世界,但正如现实世界一样,十进制为主的世界也会有万千百概念。所以在实际的应用中,会出现32位和64位的计算机系统。当然,前面还有过16位、8位和4位等,以后还可以会…...
指针的介绍2后
1.二级指针 1.1二级指针的介绍 二级指针是指向指针的指针 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 100;int* pa &a;int** ppa &pa;printf("a %d\n", a);printf("&a(pa) %p\n", pa);prin…...
Linux 学习笔记__Day3
十八、设置虚拟机的静态IP 1、VMware的三种网络模式 安装VMware Workstation Pro之后,会在Windows系统中虚拟出两个虚拟网卡,如下: VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT…...
Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)
一、编译SDL2-2.0.9 (1), ./configure --prefix/home/z/Desktop/sdl2 --enable-sharedyes --enable-nasmno --enable-audiono --enable-ossno --enable-alsano --enable-alsa-sharedno --enable-pulseaudiono --enable-pulseaudio-sharedno …...
【时时三省】(C语言基础)文件的随机读写
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例: 这个输出的就是ade seek_cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK_CUR…...
HPO3:提升模型性能的高效超参数优化工具
引言 在当今快速发展的数据科学和机器学习领域中,超参数优化(Hyperparameter Optimization, HPO)是构建高性能模型不可或缺的一环。为了简化这一复杂过程,恒通网络科技团队推出了HPO3模块——一个专为Python开发者设计的强大库&a…...
【Docker】Docker入门了解
文章目录 Docker 的核心概念Docker 常用命令示例:构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么?****为什么 C 开发者需要 Docker?** **二、核心概…...
AIGC(生成式AI)试用 19 -- AI Agent
AI Agent:自主完成特定目标任务。 AI Agent:以大语言模型为大脑驱动的系统,具备自主理解、感知、规划、记忆和使用工具的能力,能够自动化执行完成复杂任务的系统。AI Agent不同于传统的人工智能,它具备通过独立思考、调…...
LeetCode:70. 爬楼梯
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的…...
《Trustzone/TEE/安全从入门到精通-标准版》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...
2025神奇的数字—新年快乐
2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。2025…...
第一个3D程序!
运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...
Hive:内部表和外部表,内外转换
内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...
2024收尾工作
目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…...
能说说MyBatis的工作原理吗?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 能说说MyBatis的工作原理吗? MyBatis 是一款流行的持久层框架,它通过简化数据库操作,帮助开发者更高效地与数据库进行交互。MyBatis…...
简单的SQL语句的快速复习
语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
