精通C++ STL(七):stack和queue的介绍及使用

news2024/11/15 15:30:30

目录

stack

  stack的定义方式

  stack的使用

queue

  queue的定义方式

  queue的使用


stack

        stack 是一种容器适配器,专门用于处理后进先出的操作场景。它仅允许在容器的一端进行元素的插入和提取操作。

  stack的定义方式

        方式一: 使用默认适配器定义栈。

stack<int> st1;

        方式二: 使用指定的适配器定义栈。 

stack<int, vector<int>> st2;
stack<int, list<int>> st3;

注意: 如果未为 stack 指定特定的底层容器,默认情况下将使用 deque 作为底层容器。 

  stack的使用

stack中常用的成员函数如下:

成员函数功能
empty判断栈是否为空
size获取栈中有效元素个数
top获取栈顶元素
push元素入栈
pop元素出栈
swap交换两个栈中的数据

emplace

构造并插入元素

        empty

        empty 函数用于判断栈是否为空。它返回一个布尔值,如果栈为空则返回 true,否则返回 false

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st;
    
    if (st.empty()) {
        std::cout << "Stack is empty" << std::endl;
    }
    
    st.push(10);
    
    if (!st.empty()) {
        std::cout << "Stack is not empty" << std::endl;
    }
    
    return 0;
}

        size

        size() 用于返回当前栈中元素的个数。

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st;
    
    st.push(1);
    st.push(2);
    st.push(3);
    
    std::cout << "Stack size: " << st.size() << std::endl; // 输出:3
    
    return 0;
}

        top

        top 函数用于获取栈顶元素的引用。

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st;
    
    st.push(10);
    st.push(20);
    st.push(30);
    
    std::cout << "Top element: " << st.top() << std::endl; // 输出:30
    
    return 0;
}

        push

        push 函数用于向栈中添加元素,新的元素会成为栈顶元素。

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st;
    
    st.push(1);
    st.push(2);
    st.push(3);
    
    std::cout << "Top element after push: " << st.top() << std::endl; // 输出:3
    
    return 0;
}

        pop

        pop 函数用于移除栈顶元素,但不会返回该元素。

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st;
    
    st.push(10);
    st.push(20);
    st.push(30);
    
    st.pop(); // 移除栈顶元素 30
    
    std::cout << "Top element after pop: " << st.top() << std::endl; // 输出:20
    
    return 0;
}

        swap

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

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> st1, st2;
    
    st1.push(1);
    st1.push(2);
    st2.push(3);
    st2.push(4);
    
    st1.swap(st2);
    
    std::cout << "Top element of st1 after swap: " << st1.top() << std::endl; // 输出:4
    std::cout << "Top element of st2 after swap: " << st2.top() << std::endl; // 输出:2
    
    return 0;
}

        emplace

        emplace 函数用于在栈顶直接构造元素,而不需要先创建一个临时对象。

示例:

#include <iostream>
#include <stack>

int main() {
    std::stack<std::pair<int, int>> st;
    
    st.emplace(1, 2);
    
    std::cout << "Top element: (" << st.top().first << ", " << st.top().second << ")" << std::endl; // 输出:(1, 2)
    
    return 0;
}

queue

        队列(queue)是一种容器适配器,它用于实现先进先出(FIFO, First In First Out)的操作模式。在队列中,元素的插入操作只能在容器的一端(称为尾部)进行,而元素的提取操作只能在另一端(称为头部)进行。

        因此,队列的第一个元素总是最先被移除,而最新添加的元素则位于队列的末尾,等待被处理。 

  queue的定义方式

        方式一:使用默认的适配器定义队列。

queue<int> q1;

        方式二:使用特定的适配器定义队列。

queue<int, vector<int>> q2;
queue<int, list<int>> q3;

注意:如果没有为 queue 指定特定的底层容器,默认情况下使用的是 deque(双端队列) 作为底层容器。 

  queue的使用

        queue中常用的成员函数如下:

成员函数功能
empty判断队列是否为空
size获取队列中有效元素个数
front获取队头元素
back获取队尾元素
push队尾入队列
pop队头出队列
swap交换两个队列中的数据

emplace

构造并插入元素

        empty

        empty 函数用于判断队列是否为空。它返回一个布尔值,如果队列为空则返回 true,否则返回 false

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    if (q.empty()) {
        std::cout << "Queue is empty" << std::endl;
    }
    
    q.push(1);
    
    if (!q.empty()) {
        std::cout << "Queue is not empty" << std::endl;
    }
    
    return 0;
}

        size

        size 函数用于返回队列中元素的个数。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(1);
    q.push(2);
    q.push(3);
    
    std::cout << "Queue size: " << q.size() << std::endl; // 输出:3
    
    return 0;
}

        front

        front 函数用于获取队列的第一个元素的引用。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(10);
    q.push(20);
    q.push(30);
    
    std::cout << "Front element: " << q.front() << std::endl; // 输出:10
    
    return 0;
}

        back

        back 函数用于获取队列的最后一个元素的引用。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(10);
    q.push(20);
    q.push(30);
    
    std::cout << "Back element: " << q.back() << std::endl; // 输出:30
    
    return 0;
}

        push

        push 函数用于向队列的尾部添加新元素。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(1);
    q.push(2);
    q.push(3);
    
    std::cout << "Queue elements after push operations: ";
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }
    std::cout << std::endl;
    
    return 0;
}

        pop

        pop 函数用于从队列中移除第一个元素,但不会返回该元素。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;
    
    q.push(1);
    q.push(2);
    q.push(3);
    
    q.pop(); // 移除第一个元素 1
    
    std::cout << "Queue elements after pop: ";
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }
    std::cout << std::endl;
    
    return 0;
}

        swap

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

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q1, q2;
    
    q1.push(1);
    q1.push(2);
    q2.push(3);
    q2.push(4);
    
    q1.swap(q2);
    
    std::cout << "Queue 1 after swap: ";
    while (!q1.empty()) {
        std::cout << q1.front() << " ";
        q1.pop();
    }
    std::cout << std::endl;
    
    std::cout << "Queue 2 after swap: ";
    while (!q2.empty()) {
        std::cout << q2.front() << " ";
        q2.pop();
    }
    std::cout << std::endl;
    
    return 0;
}

        emplace

        emplace 函数用于在队列的尾部直接构造一个新元素,而不需要先创建一个临时对象。

示例:

#include <iostream>
#include <queue>

int main() {
    std::queue<std::pair<int, int>> q;
    
    q.emplace(1, 2); // 直接构造一个 pair<int, int> 对象
    
    std::cout << "Front element: (" << q.front().first << ", " << q.front().second << ")" << std::endl; // 输出:(1, 2)
    
    return 0;
}

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

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

相关文章

Linux 进程调度(三)之进程的优先级

目录 一、概述二、进程的优先级1、基础概念2、优先级的意义3、查看优先级4、PRI 和 NI5、修改优先级6、控制进程的优先级的系统调用7、调整优先级的限制 一、概述 在 Linux 中&#xff0c;每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程…

gin框架中的中断请求c.Abort()方法的作用和使用细节说明

Abort()方法的作用 在gin框架中&#xff0c;如果我们希望中断后续的挂起的请求处理链&#xff08;HandlersChain&#xff09;的请求&#xff0c; 可以使用gin.Context中的这个Abort()方法。请注意&#xff0c;这不会停止当前处理程序。假设您有一个授权中间件&#xff0c;用于…

Vue技术栈-Vue 3 项目组件入门:单文件组件 (SFC)

目录 前言 1.简介 2.安装 Vite 和 Vue 3 3.什么是.vue文件? vue 文件解析 4.什么是VUE的组件? 5.工程化vue项目如何组织这些组件? 6.Vue3关于样式( CSS )的导入方式 7.结语 前言 本篇是在上一篇Vue技术栈-Vite最新版创建一个Vue3项目的基础上的后续,先对Vite这一构…

加密狗创新解决方案助力工业自动化

面临的挑战 早在1991年&#xff0c;COPA-DATA就认识到需要一个既能提供长期保护又能灵活应对的解决方案&#xff0c;以防止软件盗版并确保客户在各种复杂的工业环境下能够顺利使用其产品。这一解决方案不仅要兼容Windows系统&#xff0c;还必须在网络连接受限的情况下&#xff…

Python绘图入门:使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分&#xff0c;通过图表&#xff0c;我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一&#xff0c;非常适合初学者。本文将带你从零开始&#xff0c;逐步创建和自定…

接口基础知识6:详解http request body(一篇讲完常见请求体)

课程大纲 一、定义 HTTP请求体&#xff08;HTTP Request body&#xff09;&#xff1a;HTTP请求消息的可选部分&#xff0c;仅在请求方法支持且需要发送数据时使用。 POST方法、PUT方法有请求体&#xff0c;GET和HEAD方法没有请求体。 请求头和请求体之间会有一个空行&#…

GA/T1400视图库平台Easy1400软件平台的功能介绍及其应用场景介绍

GA/T 1400标准是中国公安部制定的一系列技术规范&#xff0c;主要针对公安视频图像信息应用系统。这一标准分为多个部分&#xff0c;涵盖了通用技术要求、应用平台技术要求、数据库技术要求等。GA/T 1400视图库标准是为了统一和规范公安系统内视频监控资源的管理和应用&#xf…

Java元组Tuple的使用

WHY&#xff1f; 通常情况下&#xff0c;一个方法返回值是一个&#xff0c;类型固定&#xff08;当然你要封装成对象就另一说了&#xff09;。如果想要在一个方法中返回多个类型不同的值&#xff08;不要封装成对象&#xff09;&#xff1f;这个时候就可以使用元组。典型的需求…

初识IDEA

一、IDEA简介 IDEA 全称 IntelliJ IDEA&#xff0c;是 JAVA编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 java开发⼯具 之⼀&#xff0c;尤其在智能代码助⼿、代码⾃动提示、重构、J2EE⽀持、Ant、JUnit、CVS整合、代码审 查⽅⾯。 JetBrains官⽹ : JetBrains: Esse…

计算机网络TCP/UDP知识点

这是一些在学习过程中关于计算机网络八股文的一些知识点记录&#xff1a; TCP/UDP TCP怎么保证可靠性 1.序列号&#xff0c;确认应答&#xff0c;超时重传 数据到达接收方&#xff0c;接收方需要发出一个确认应答&#xff0c;表示已经收到该数据段&#xff0c;并且确认序号…

有哪些核定生产能力的方法?详解标准工时的测定方法与核定方法!

在当今制造业的快速发展中&#xff0c;生产能力管理已成为企业核心竞争力的关键。它不仅关系到企业如何高效地满足市场需求&#xff0c;更直接影响到生产成本的控制和市场响应速度。准确核定生产能力&#xff0c;是实现生产计划与企业资源优化配置的桥梁。本文将深入探讨核定生…

KCP源码解析系列(一)KCP协议介绍

一、什么是KCP TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的…

Linux环境安装Docker Engine并打包部署Java项目

文章目录 1、卸载老版本2、配置docker仓库3、安装最新版docker4、启动docker启动重启开机启动停止查看状态&#xff1a;已经启动查看状态&#xff1a;没有启动 5、查看版本6、运行hello world测试7、配置镜像8、使用docker安装一个应用9、其他命令查看运行的docker应用查看容器…

【网络ping】无法ping通电脑 服务器失败是什么原因

【网络ping】无法ping通电脑 服务器失败是什么原因 转载&#xff1a; https://www.lsjlt.com/ask/show/show.php?id80772631782 点击此处 查看博文《无法ping通的原因》 一、无法ping 通的原因 网络连接问题&#xff1a;首先需要检查网络连接是否正常。可以尝试通过ping其他…

全国首个数据要素人才标准,亿信华辰携76家单位共同起草

在数字化浪潮汹涌的今天&#xff0c;数据已跃升为社会经济发展的核心引擎。如何精准、高效地评估数据要素领域人才的专业能力&#xff0c;成为了亟待解决的关键议题。亿信华辰积极响应国家战略布局&#xff0c;依托自身在大数据管理与应用领域的深厚底蕴&#xff0c;携手业界76…

阿里推出视频 AI 生成式框架 Tora,通过轨迹生成视频

在科技高速发展的今天&#xff0c;AI 已经开始融入人们的生活&#xff0c;就在不久前阿里集团推出了一款可以生成视频的 AI 框架 Tora&#xff0c;这是一款可以面向轨迹的 DiT 框架&#xff0c;它可以结合文本、视觉以及轨迹生成视频。 Tora 之前有可以生成视频的模型也就是扩…

Docker数据管理和网络管理

文章目录 一、Docker数据管理Docker容器的分层哪些数据需要持久化容器数据持久保存方式数据卷&#xff08;data volume&#xff09;数据卷的使用场景数据卷的特点数据卷使用方法实际例子 二、网络管理Docker安装完成后默认的网络设置创建容器后的网络配置修改默认网络设置容器名…

vue3前端开发-小兔鲜-购物车的列表渲染和删除及统计计算

vue3前端开发-小兔鲜-购物车的列表渲染和删除及统计计算&#xff01;这一次&#xff0c;完成列表的渲染和统计计算的内容&#xff0c;比如&#xff0c;统计购物车内有多少货物的数量&#xff0c;及商品的总价格。 <script setup> import { useCartStore } from /stores/c…

RPA财务机器人是什么,RPA的具体应用场景有哪些?| 实在RPA研究

越来越多的人工智能及超自动化技术在企业财务工作中得以普及应用&#xff0c;以提升财务工作效率&#xff0c;促进财务部门实现全面数字化转型。 RPA财务机器人是什么&#xff1f; RPA&#xff0c;即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#…

【方案合集】园区数据治理解决方案(PPT原件)

1、园区大数据治理综述 2、园区大数据治理总体架构 3、园区大数据治理演进路线 4、园区大数据治理建设实施 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划…