C++初阶(十七)--STL--stack和queue详解及使用

目录

stack

概念

stack的定义

stack的使用

queue

概念

queue的定义

queue的使用


在 C++ 的标准模板库(STL)中,stack(栈)和queue(队列)是非常重要的容器适配器。它们基于其他基础容器实现,为我们提供了方便且高效的数据存储和操作方式,在许多算法和程序设计场景中都有着广泛的应用。本篇博客将详细介绍stackqueue的相关知识及其使用方法。

stack

概念

栈是一种先进后出(First In Last Out,FILO)的数据结构。就好比一个只能从一端放入和取出物品的容器,先放入的物品要等后放入的物品都取出后才能被取出。

stack的定义

在 STL 中,stack是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vectorlist作为底层容器,例如:

#include <stack>
#include <vector>
#include <list>

int main() 
{
    //使用默认的适配器
    std::stack<int> st1;

    // 使用 vector 作为底层容器的 stack
    std::stack<int, std::vector<int>> s1;
    // 使用 list 作为底层容器的 stack
    std::stack<int, std::list<int>> s2;
    return 0;
}

stack的使用

 这些成员函数大部分都已经是非常熟悉的了,所以这里直接把常见的用简单代码示范一下即可。

#include <iostream>
#include <stack>

int main() 
{
    // 创建一个存储整数的栈
    std::stack<int> myStack;

    // 使用push函数向栈中插入元素
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 使用size函数获取栈的大小
    std::cout << "Stack size: " << myStack.size() << std::endl;

    // 使用top函数获取栈顶元素
    std::cout << "Top element: " << myStack.top() << std::endl;

    // 使用pop函数弹出栈顶元素
    myStack.pop();

    // 再次查看栈顶元素和栈的大小
    std::cout << "After pop, top element: " << myStack.top() << std::endl;
    std::cout << "After pop, stack size: " << myStack.size() << std::endl;

    // 使用empty函数判断栈是否为空
    if (myStack.empty()) {
        std::cout << "Stack is empty." << std::endl;
    } else {
        std::cout << "Stack is not empty." << std::endl;
    }

    return 0;
}

 接下来不是很常用的一些,只介绍简单的使用,用时可以再去查文档

emplace

emplace函数用于在栈顶原地构造元素,相比push,如果插入的是对象,emplace可能会更高效,因为它避免了额外的复制或移动操作。

#include <iostream>
#include <stack>
#include <string>
using namespace  std;
struct Person 
{
    string name;
    int age;
    Person(string n, int a) 
        : name(n)
        , age(a) 
    {}
};

int main() {
    stack<Person> people;
    // 使用emplace构造并插入元素
    people.emplace("Alice", 25);
    if (!people.empty()) 
    {
        const Person& p = people.top();
        cout << "Top person: " << p.name << ", age: " << p.age <<endl;
    }
    return 0;
}

swap

swap函数用于交换两个栈的内容。

int main() {
    std::stack<int> stack1;
    stack1.push(1);
    stack1.push(2);

    std::stack<int> stack2;
    stack2.push(3);
    stack2.push(4);

    // 交换两个栈的内容
    stack1.swap(stack2);

    return 0;
}

queue

概念

队列是一种先进先出(First In First Out,FIFO)的数据结构。想象成一个排队的场景,先进入队列的元素先被处理。

queue的定义

在 STL 中,queue是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vectorlist作为底层容器,例如:

//默认容器
queue<int> q1;
//特定适配器
queue<int, vector<int>> q2;
queue<int, list<int>> q3;

queue的使用

这里对常见函数进行简单示范:

#include <queue>
#include <iostream>

using namespace std;

struct MyStruct 
{
    int x;
    MyStruct(int a) 
        : x(a) 
    {}
};

int main() 
{
    // 1. 使用默认构造函数创建队列
    queue<int> myQueue;

    // 2. 使用empty检查队列是否为空
    if (myQueue.empty()) 
    {
        cout << "队列是空的" << endl;
    }

    // 3. 使用push插入元素
    myQueue.push(1);
    myQueue.push(2);

    // 4. 使用size获取队列大小
    cout << "队列的大小是: " << myQueue.size() << endl;

    // 5. 使用front访问队列头部元素
    int frontElement = myQueue.front();
    cout << "队列头部的元素是: " << frontElement << endl;

    // 6. 使用back访问队列尾部元素
    int backElement = myQueue.back();
    cout << "队列尾部的元素是: " << backElement << endl;

    // 7. 使用emplace构造并插入元素
    queue<MyStruct> myStructQueue;
    myStructQueue.emplace(3);

    // 8. 使用pop移除队列头部元素
    myQueue.pop();

    // 9. 交换两个队列(这里使用成员函数swap)
    queue<int> anotherQueue;
    anotherQueue.push(4);
    myQueue.swap(anotherQueue);

    // 10. 使用关系运算符比较队列(这里比较是否相等)
    if (myQueue == anotherQueue) 
    {
        cout << "两个队列相等" << endl;
    }

    // 11. 使用非成员函数swap交换队列(与成员函数swap功能类似)
    queue<int> queue1;
    queue1.push(5);
    queue<int> queue2;
    queue2.push(6);
    swap(queue1, queue2);

    return 0;
}

 


本篇博客到此结束,欢迎评论区留言~

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

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

相关文章

【ubuntu24.04】GTX4700 配置安装cuda

筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda

远程桌面协助控制软件 RustDesk v1.3.3 多语言中文版

RustDesk 是一款开源的远程桌面软件&#xff0c;支持多平台操作&#xff0c;包括Windows、macOS、Linux、iOS、Android和Web。它提供端到端加密和基于角色的访问控制&#xff0c;确保安全性和隐私保护。使用简单&#xff0c;无需复杂配置&#xff0c;通过输入ID和密码即可快速连…

【Linux】gdb / cgdb 调试 + 进度条

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、Linux调试器-gdb &#x1f31f;开始使用 &#x1f320;小贴士&#xff1a; &#x1f31f;gdb指令 &#x1f320;小贴士&#xff1a; ✨watch 监视 ✨打条件断点 二、小程序----进…

C++初阶——动态内存管理

目录 1、C/C内存区域划分 2、C动态内存管理&#xff1a;malloc/calloc/realloc/free 3、C动态内存管理&#xff1a;new/delete 3.1 new/delete内置类型 3.2 new/delete自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 5.1 内置类型 5.2 自定…

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

基于java+SpringBoot+Vue的教学辅助平台设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

mfc110u.dll是什么意思,mfc110u.dll丢失解决方法大全详解

mfc110u.dll是Microsoft Foundation Classes (MFC)库的一个特定版本&#xff08;版本11.0&#xff09;的Unicode动态链接库文件。MFC是Microsoft为C开发者设计的一个应用程序框架&#xff0c;主要用于简化Windows应用程序的开发工作。这个框架封装了很多Windows API函数&#x…

MySQL查看日志

目录 1. 日志 1.1 错误日志 1.2 二进制日志 1.2.1 介绍 1.2.2 格式 1.2.3 查看 1.2.4 删除 1.3 查询日志 1.4 慢查询日志 1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过…

API平台建设之路:从0到1的实践指南

在这个互联网蓬勃发展的时代&#xff0c;API已经成为连接各个系统、服务和应用的重要纽带。搭建一个优质的API平台不仅能为开发者提供便利&#xff0c;更能创造可观的商业价值。让我们一起探讨如何打造一个成功的API平台。 技术架构是API平台的根基。选择合适的技术栈对平台的…

【组件封装】uniapp vue3 封装一个自定义下拉刷新组件pullRefresh,带刷新时间和加载动画教程

文章目录 前言一、实现原理二、组件样式和功能设计三、scroll-view 自定义下拉刷新使用回顾相关属性&#xff1a;最终版完整代码&#xff1a; 前言 手把手教你封装一个移动端 自定义下拉刷新组件带更新时间和加载动画&#xff08;PullRefresh&#xff09;&#xff0c;以uniapp …

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)

CodeMonkey教程&#xff1a; https://www.youtube.com/watch?vQDWlGOocKm8 Siki学院汉化教程&#xff1a;如何使用Unity开发分手厨房&#xff08;胡闹厨房&#xff09;-Unity2023 - SiKi学院|SiKi学堂 - unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程 版本&am…

2-2-18-7 QNX 系统架构-动态链接

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

PPT不能编辑,按钮都是灰色,怎么办?

PPT文件打开之后&#xff0c;发现无法编辑&#xff0c;再仔细查看发现工具栏中的功能按钮都是灰色的&#xff0c;无法使用&#xff0c;这是什么原因&#xff1f;该如何解决&#xff1f; 原因&#xff1a;无法编辑PPT文件&#xff0c;并且功能按钮都是灰色&#xff0c;这是因为…

PMP–一、二、三模、冲刺–分类–8.质量管理

文章目录 技巧五、质量管理 一模8.质量管理--质量管理计划--质量管理计划包括项目采用的质量标准&#xff0c;到底有没有满足质量需求&#xff0c;看质量标准即可。6、 [单选] 自项目开始以来&#xff0c;作为项目经理同事的职能经理一直公开反对该项目&#xff0c;在讨论项目里…

深度学习中的生成对抗网络(GAN)原理与应用

引言 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型&#xff0c;它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

macOS无法打开未验证安装包的解决方案:无法打开‘XXX.pkg’,因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件

macOS无法打开未验证安装包的解决方案&#xff1a;无法打开‘XXX.pkg’&#xff0c;因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件 在macOS Ventura及以上版本中&#xff0c;系统安全性进一步加强&#xff0c;默认情况下不允许运行未验证或未签名的应用程序。当…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法&#xff0c;用于处理异步操作的成功&#xff08;成功回调&#xff09;和失败&#xff08;失败回调&#xff09;情况。这两个方法通常与async/await语法一起使用&#xff0c;但也可以单独使用…