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 here
        if (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的介绍

介绍文档
介绍:

  1. 优先队列是一种容器适配器,更具严格的弱排序标准,他的第一个元素总是它所包含元素的中的最大值
  2. 类似于堆, 在堆中随时插入元素,并且只能检索最大的堆中元素 (优先队列中位于顶部的元素)
  3. 优先队列被实现为容器适配器,容器适配器即将特定的容器封装为其底层的容器类,queue提供的一组特定的成员函数来访问其元素。元素从特定的容器“尾部”弹出,其被称为优先队列的顶部
  4. 底层的容器可以是任何标准的类模板,也可以是其他特定的设计类模板。容器应该可以通过随机访问迭代器访问,并支持以下的操作:
    • empty():检测容器是否为空
    • size():返回容器中有效元素个数
    • front():返回容器中第一个元素的引用
    • push_back():在容器尾部插入元素
    • pop_back():删除容器尾部元素
  5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue
    类实例化指定容器类,则使用vector。
  6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用
    算法函数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不是这道题最优的解法,大家可以下去自己探索哈 😛

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址&#xff0c;指向另一个数据。 Rust 中最常见的指针是引用&#xff0c…

单调栈算法

文章目录 题目概述题目详解739.每日温度1475.商品折扣后的最终价格84.柱状图中最大的矩形 题目概述 单调栈&#xff1a;栈&#xff0c;并且栈是有序的 单调栈的两种写法&#xff1a; 左 -> 右&#xff0c;或者右 -> 左 建议使用左到右的写法 及时去掉无用元素&#xff0c…

vue-有关于TS与路由器

title: vue(TS)路由器 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端Vue3-第二部分 这里是代码中出现TS的&#xff0c;后面是路由器 现在先上代码&#xff0c;步步分析。 eg1-props的使用 步步分析代码&#xff08;先理解&#xff0c;再实践&#xff09; 框架…

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…

(done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?

由于操作系统和编译器约定了 ABI&#xff0c;如下&#xff1a; 编译器在对 C 语言编译时&#xff0c;会自动 caller 标注的寄存器进行保存恢复。保存的步骤通常发生在进入函数的时候&#xff0c;恢复的步骤通常发生在从函数返回的时候。 内核线程切换需要保存的寄存器&#…

把本地搭建的hexo博客部署到自己的服务器上

配置远程服务器的git 安装git 安装依赖工具包 yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel安装编译工具 yum install -y gcc perl-ExtUtils-MakeMaker package下载git&#xff0c;也可以去官网下载了传到服务器上 wget https://www.ke…

71-《颠茄》

颠茄 颠茄&#xff0c;别名&#xff1a;野山茄、美女草、别拉多娜草&#xff0c;拉丁文名&#xff1a;Atropa belladonna L.是双子叶植物纲、茄科、颠茄属多年生草本&#xff0c;或因栽培为一年生&#xff0c;根粗壮&#xff0c;圆柱形。茎下部单一&#xff0c;带紫色&#xff…

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…

计算机组成原理(2)王道学习笔记

数据的表示和运算 提问&#xff1a;1.数据如何在计算机中表示&#xff1f; 2.运算器如何实现数据的算术、逻辑运算&#xff1f; 十进制计数法 古印度人发明了阿拉伯数字&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#…

npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported

vue 启动项目时&#xff0c;npm run serve 报下面的错&#xff1a; error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:67:19) at Object.createHash (node:crypto:133:10) at FSReqCallback.readFileAfterClose [as on…

「 机器人 」仿生扑翼飞行器中的“被动旋转机制”概述

前言 在仿生扑翼飞行器的机翼设计中,模仿昆虫翼的被动旋转机制是一项关键技术。其核心思想在于:机翼旋转角度(攻角)并非完全通过主动伺服来控制,而是利用空气动力和惯性力的作用,自然地实现被动调节。以下对这种设计的背景、原理与优势进行详细说明。 1. 背景:昆虫的被动…

防御保护第一次实验:安全策略配置

一、实验拓扑 二、实验要求 三、需求分析 1.创建两个vlan 2.在ENSP中配置基于时间的ACL实现对于办公区PC访问OA Server的时间限制&#xff08;工作日早8到晚6&#xff09;。 3.通过配置基于MAC地址的ACL来实现对于生产区PC访问Web Server的限制&#xff08;除PC3外不能访问&am…

[权限提升] Windows 提权 — 系统内核溢出漏洞提权

关注这个框架的其他相关笔记&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;系统内核溢出漏洞提权介绍 注意&#xff1a;提权很容易让电脑蓝屏&#xff0c;所以如果是测试的话&#xff0c;提权前最好做好系统备份。 溢出漏洞就像是往杯子里装水 —— 如…

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

【Rust自学】15.7. 循环引用导致内存泄漏

说句题外话&#xff0c;这篇文章真心很难&#xff0c;有看不懂可以在评论区问&#xff0c;我会尽快作答的。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω…

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django博客系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展&#xff0c;信息的传播与…

乐优商城项目总结

文章目录 项目简介微服务集群1.enreka注册中心2. zuul网关3. 公共工具类4. 商品微服务5. 文件上传微服务6. 搜索微服务7. 页面静态化微服务8. 用户微服务9. 短信微服务10. 认证微服务11. 购物车微服务12. 订单微服务项目最大的收获项目遇到的问题 项目简介 乐优商城是一个全品…