C++ 学习系列 -- std::stack 与 std::queue

一  std::stack 与 std::queue 分别是什么?

 两者均是 c++ 中的序列化容器,区别在于:

 std::stack   元素是先进后出

 std::queue 元素是先进先出

二  std::stack 与 std::queue 原理

1 std:statck

2. std::queue

两者底层容器可以是 list 也可以是 deque ;

为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。

三  常见函数接口与使用

1.  std::stack

1.1 构造函数

std::stack<T,Container>::stack - cppreference.com

函数说明
stack()空构造函数

1.2  容器修改

              

函数说明
push在栈顶 放入元素
emplace在栈顶 放入元素,也可以放入元素类的参数,实现原地构造
pop弹出栈顶元素

1.3 容器访问

函数说明
top返回栈顶元素的引用

1.4 容器空间

函数说明
empty判断栈是否为空
size返回栈中元素个数

代码如下:

#include<iostream>
#include<stack>int main()
{// 1. constructorstd::stack<int> tmp_stack;// 2. Modifierstmp_stack.push(1);tmp_stack.push(2);tmp_stack.push(3);tmp_stack.push(3);tmp_stack.pop();    tmp_stack.emplace(4);tmp_stack.emplace(5);// 3. Element accessstd::cout << tmp_stack.top() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::cout << tmp_stack.empty() << std::endl;std::cout << tmp_stack.size() << std::endl;std::cout << "------" << std::endl;while (!tmp_stack.empty()) {std::cout << tmp_stack.top() << " ";tmp_stack.pop();}return 0;
}

2. std::queue

1.1 构造函数

   https://en.cppreference.com/w/cpp/container/queue/queue

函数说明
queue空构造函数

1.2  容器修改

函数说明
push在队尾放入元素
emplace在队尾 放入元素,也可以放入元素类的参数,实现原地构造
pop弹出队首元素

1.3 容器访问

函数说明
front返回队首元素的引用
back返回队尾元素的引用

1.4 容器空间

函数说明
empty判断queue 是否为空
size返回queue中元素个数

   代码:

  

#include<iostream>
#include<queue>int main()
{// 1. constructorstd::queue<int> tmp_queue;// 2. Modifierstmp_queue.push(1);tmp_queue.push(2);tmp_queue.push(3);tmp_queue.push(3);tmp_queue.pop();tmp_queue.emplace(4);tmp_queue.emplace(5);// 3. Element accessstd::cout << tmp_queue.front() << std::endl;std::cout << tmp_queue.back() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::cout << tmp_queue.empty() << std::endl;std::cout << tmp_queue.size() << std::endl;std::cout << "------" << std::endl;while (!tmp_queue.empty()) {std::cout << tmp_queue.front() << " ";tmp_queue.pop();}

  输出:

   

四  简单实现

下面代码中的 my_deque.h 为 这个博客中实现的 my_deque

C++ -- 学习系列 std::deque 的原理与使用-CSDN博客

1. my_stack

// my_stack.h#include"my_deque.h"template<typename T>
class my_stack
{
public:my_stack(){}~my_stack(){}void push(T& val){data.push_back(val);}void push(T&& val){data.push_back(val);}T& top(){return data.back();}void pop(){data.pop_back();}int size(){return data.size();}bool empty(){return data.empty();}private:my_deque<T, 16> data;};
// main.cpp
int main()
{// 1. constructorstd::stack<int> tmp_stack;// 2. Modifierstmp_stack.push(1);tmp_stack.push(2);tmp_stack.push(3);tmp_stack.push(3);tmp_stack.pop();tmp_stack.emplace(4);tmp_stack.emplace(5);// 3. Element accessstd::cout << tmp_stack.top() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::cout << tmp_stack.empty() << std::endl;std::cout << tmp_stack.size() << std::endl;std::cout << "------" << std::endl;while (!tmp_stack.empty()) {std::cout << tmp_stack.top() << " ";tmp_stack.pop();}return 0;
}

输出:

  

2. my_queue

// my_queue.h#include"my_deque.h"template<typename T>
class my_queue
{
public:my_queue(){}~my_queue(){}void push(T& val){data.push_back(val);}void push(T&& val){data.push_back(val);}void pop(){data.pop_front();}T& front(){return data.front();}T& back(){return data.back();}bool empty(){return data.empty();}int size(){return data.size();}private:my_deque<T, 16>  data;};// main.cppint main()
{// 1. constructormy_queue<int> tmp_queue;// 2. Modifierstmp_queue.push(1);tmp_queue.push(2);tmp_queue.push(3);tmp_queue.push(3);tmp_queue.pop();// 3. Element accessstd::cout << tmp_queue.front() << std::endl;std::cout << tmp_queue.back() << std::endl;std::cout << "------" << std::endl;// 4. Capacitystd::cout << tmp_queue.empty() << std::endl;std::cout << tmp_queue.size() << std::endl;std::cout << "------" << std::endl;while (!tmp_queue.empty()) {std::cout << tmp_queue.front() << " ";tmp_queue.pop();}return 0;
}

 输出:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

【数据结构】二叉树链式结构补充和二叉树的顺序结构及实现

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言&#x1f4da;一、二叉树链…

自学WEB后端05-Node.js后端服务链接数据库redis

嘿&#xff0c;亲爱的小伙伴们&#xff01;&#x1f604; 今天我要给大家分享一个超级方便且高效的 NoSQL 类型数据库——Redis&#xff01;&#x1f4a1; 它可不是一般的关系型数据库哦&#xff0c;而是以键值对形式存储数据的内存数据库。&#x1f4da; 快跟着我一起来学习如…

使用VSCODE 调试ros2具体设置

vscode 调试 ROS2 张得帅&#xff01; 于 2023-09-09 15:39:39 发布 456 收藏 1 文章标签&#xff1a; vscode ros2 版权 1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件&#xff0c;添…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

day06_循环

今日内容 零、 复习昨日 一、循环 二、流程控制关键词 零、 复习昨日 8个基本数据类型 变量的使用步骤 1)声明2)赋值3)使用 声明,数据类型 变量名 不一定非得是基本类型 int a; String s; Scanner scanner;赋值,只要符合类型(能默认转换)就能赋值 int a 1; double d 1; Scann…

国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!

大家好&#xff0c;CoCode开发云旗下Co-Project V3.6智能项目管理平台正式发布&#xff0c;平台新增功能点锁定功能、敏捷开发模式新增估算板块和两种估算方式。 功能点锁定功能进一步提高了项目估算的灵活性和准确性&#xff0c;有利于提高项目估算效率&#xff1b;而敏捷开发…

RTSP协议抓包及讲解

文章目录 前言一、RTSP 亲手搭建直播点播1、数据源为视频文件2、数据源为摄像头①、搭建 RTSP 流媒体服务器②、客户端拉流 二、RTSP 协议简介三、手撕 RTSP 协议1、Wireshark 抓包①、搭建环境②、wireshark 抓包 2、RTSP 交互流程①、OPTIONS②、DESCRIBE③、SETUP④、PLAY⑤…

Acwing 143. 最大异或对

Acwing 143. 最大异或对 题目描述思路讲解代码展示 题目描述 思路讲解 这道题的启示是&#xff1a;字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字 思路:将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异. 代码展示 #include<iostream…

Spring的依赖注入(DI)以及优缺点

Spring的依赖注入&#xff08;DI&#xff09;&#xff1a;解释和优点 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是Spring框架的核心概念之一&#xff0c;也是现代Java应用程序开发的重要组成部分。本文将深入探讨DI是什么&#xff0c;以及它的…

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…

WinHex数据恢复方法(误删后没覆盖)

winhex永远滴神&#xff01;winhex永远滴神&#xff01;winhex永远滴神&#xff01; md&#xff0c;安卓手机插u盘&#xff0c;改个文件夹名竟然把整个文件夹搞没了&#xff01;于是我赶紧查怎么恢复&#xff0c;然后依次找到并试用了diskgenus&#xff08;410RMB&#xff09;、…

Blued引流脚本

于多数人来说&#xff0c;引流都是一个比较困难的操作&#xff0c;因为流量不会听你的。所以任何人在网上做生意&#xff0c;或者开一个实体店&#xff0c;都会为流量而发愁&#xff0c;其实对于流量的吸引来说&#xff0c;我们越是刻意为之&#xff0c;可能所获得的效果也越不…

实现单行/多行文本溢出

在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示&#xff0c;超出…

网络安全渗透测试工具之skipfish

网络安全渗透测试工具skipfish介绍 在数字化的时代,Web 应用程序安全成为了首要任务。想象一下,您是一位勇敢的安全冒险家,迎接着那些隐藏在 Web 应用程序中的未知风险。而在这个冒险之旅中,您需要一款强大的工具来帮助您发现漏洞,揭示弱点。而这个工具就是 Skipfish。 …

ChatGPT Prompting开发实战(十二)

一、如何开发prompts实现个性化的对话方式 通过设置“system”和“user”等roles&#xff0c;可以实现个性化的对话方式&#xff0c;并且可以结合参数“temperature”的设定来差异化LLM的输出内容。在此基础上&#xff0c;通过构建一个餐馆订餐对话机器人来具体演示对话过程。…

计算机竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

国庆作业2

select实现服务器并发 代码&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…

1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析

漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞&#xff0c;相关时间线如下&#xff1a; 9月7日&#xff0c;苹果发布紧急更新&#xff0c;修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞&#xff0c;漏洞被认为已经被…