当前位置: 首页 > news >正文

【STL】| C++ 栈和队列(详解、容器适配器的初步引入)

目录

前言

总代码

容器适配器的引入

栈 stack

队列 queue

栈和队列用法简介

队列

deque简介(了解即可)

结语


前言

今天我们要讲解的结构是栈和队列

这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容器适配器的引入)

如果有需要了解这两个数据结构的具体函数用法的话,也可以在较为官方的网站上进行查阅,如下

https://legacy.cplusplus.com/reference/stack/stack/?kw=stack

总代码

如果有友友只是复习需要,只想看完整代码的话,可以直接点下面的gitee链接

当然对于看完了整篇文章的友友也可以照着这里的代码敲一篇进一步理解喔...(* ̄0 ̄)ノ

gitee - stack & queue - blog - 2024-08-08

容器适配器的引入

在之前,我们实现的数据结构都是使用的迭代器,但是今天这两个并不是使用迭代器的,因为栈和队列这两个就是插入数据,拿出数据,出栈、出队列,并没有遍历一遍我看看里面的数据一说

所以我们今天会用到一个容器适配器

什么是容器适配器呢?

现象上来看就是一个函数模板上面的参数,我们将已经存在的数据结构如vector、list、deque等作为模板供类使用

就拿栈来举例子吧,试想一下,我们的栈就是一个入栈、出栈

而这两个动作在我们的vector里就是尾插、尾删

同样的,什么empty、size、top(就是vector里面的back),都能使用这些函数的功能,所以我们就不需要自己写,我们只需要使用这些已存在的容器即可

举个例子:

template<class T, class container = vector<T>>

而我们的类,内部的成员就可以是 container _con;

栈 stack

如上所述,我们直接上代码:

#include<iostream>
using namespace std;
#include<vector>namespace hjx
{template<class T, class container = vector<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:container _con;};
}

我们可以看到,全程都是使用我们容器适配器的功能在复用过来实现我们的栈

这里有一点值得一提的是,我们的栈不仅仅可以用vector作为适配器,用list或者一个叫做deque的容器也可以,因为只要有尾插尾删(高效的前提下),就能被用来实现栈

队列 queue

先上代码:

#include<iostream>
using namespace std;
#include<list>namespace hjx
{template<class T, class container = list<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front(){return _con.front();}const T& back(){return _con.back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}private:container _con;};
}

我们可以看到,list和stack大部分地方都是相似的,唯一不同的两点就在于:

  1. 适配器容器stack可以使用vector,但是队列不行,因为vector的头删要挪动数据效率低
  2. queue没有top,而是front和back

栈和队列用法简介

栈符合的原理是后进先出,图示如下:

栈最常用的就是入栈、出栈,如果要将全部数据取出来的话,就写一个while循环判断栈是否为空(empty),然后挨个取  top(),出栈

代码如下(仅展示最常用的):

void test_stack1()
{stack<int> s1;s1.push(1);s1.push(2);s1.push(3);s1.push(4);while (!s1.empty()){cout << s1.top() << " ";s1.pop();}
}

队列

队列和栈同理,就是入队列,出队列

只不过和栈不同的点在于,栈是后进先出,队列是先进先出,图示如下:

而如果要将数据全部取出来的话,我们同样需要写一个while循环判断是否为空,然后取对头,出队列

代码如下(仅展示最常用的):

void test_queue1()
{queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);q1.push(5);while (!q1.empty()){cout << q1.front() << " ";q1.pop();}
}

deque简介(了解即可)

其实,C++标准库里面,栈和队列这两个的默认容器适配器是deque(模板缺省参数那里)

template<class T, class container = deque<T>>

这就要谈到一段历史了,C++曾想要打造一个容器,让其既像vector也像list

这个容器就是deque

但可以看到,这个容器并没有实现得像想象中的那么好,不然都话我们现在也不会还在用vector和list了,如果成了,直接全部去学deque就好了

对于这个结构我们需要知道的就是,他只适用于仅需要头插头删,尾插尾删的情况

如果是有说要在中间动点手脚的话,这会涉及到一个数学的逻辑,和我们要学的技术就扯得有点远了

结语

这篇博客到这里,对栈和队列的讲解就结束啦(~ ̄▽ ̄)~

如果觉得对你有帮助的话,请务必多多支持博主喔<(_ _)>~( ̄▽ ̄)~*

相关文章:

【STL】| C++ 栈和队列(详解、容器适配器的初步引入)

目录 前言 总代码 容器适配器的引入 栈 stack 队列 queue 栈和队列用法简介 栈 队列 deque简介&#xff08;了解即可&#xff09; 结语 前言 今天我们要讲解的结构是栈和队列 这两个的具体实现相比于前面我们学的string、vector、list都要简单得多&#xff08;因为容…...

xss漏洞(二,xss靶场搭建以及简单利用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一&#xff0c;环境搭建。 使用工具&#xff1a;PHP study&#xff0c;dvwa靶场。 1&#xff0c;GitHub上下载dvwa到PHP study的WWW文件夹内&#xff0c;并解压。 dvwa下载地址 …...

深度学习--------------Kaggle房价预测

目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…...

cpio 命令

前言 cpio&#xff08;Copy In and Out&#xff09;是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同&#xff0c;cpio 有其独特的优势和使用场景&#xff0c;特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…...

TreeMap自定义排序

我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下&#xff0c;我们需要自定义排序规则&#xff0c;为了代码优雅一些&#xff0c;我们也希望在stream中groupingBy时自定义排序规则&#xff0c;就可以参考本文的实现。 1. 使用TreeMap默认的排序规则&#xff08;按…...

我的CSDN 512天创作纪念日-20240807

机缘 在 2023 年 3 月 13 日&#xff0c;我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天&#xff0c;我决定将自己的实战项目经验和学习心得记录下来&#xff0c;与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想&#xff0c;促使我…...

微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域

1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中&#xff0c;nacos集群模式会导致数据库数据不一致&#xff0c;使用加一层思想&#xff0c;修改nacos的数据库&#xff0c;使用mysql数据库&…...

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数&#xff08;查询&#xff09; 分组 联表查询&#xff08;多表查询&#xff09; 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...

【AI大模型】Ollama+OpenWebUI+llama3本地大模型

本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 &#xff08;1&#xff09;目的 本教程主要关于开源A…...

习题20240807

文章目录 题目 1: 泛型类题目 2: 泛型方法题目 3: 泛型接口题目 4: 泛型约束题目 5: 泛型集合题目6&#xff1a;题目7&#xff1a;题目8&#xff1a;题目9&#xff1a; 题目 1: 泛型类 编写一个泛型类 Box&#xff0c;它能够存储一个类型为 T 的值&#xff0c;并提供方法 SetI…...

src挖掘-记一次有趣的逻辑漏洞分享

漏洞挖掘-记一次有趣的逻辑漏洞挖掘 前言简述1、信息收集2、找功能点3、挖掘漏洞案例一&#xff1a;任意用户注册漏洞案例二-垂直越权导致管理员密码重置获得管理员后台权限漏洞总结 前言 此文章是小白的学习笔记&#xff0c;请不要利用文章内相关知识点进行非法渗透&#xff…...

【C++】STL | list (链表)详解及重要函数的实现

目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init&#xff08;适合不同类型构造函数的小函数&#xff09; list的迭代器 引子 operator、operator--&#xff08;前置与后置&#xff09; operator 与 operator! operator* 与 …...

警惕智能手机的“隐形眼”:如何保护我们的数字隐私堡垒

随着智能手机深入我们生活的方方面面&#xff0c;它变得无所不在&#xff0c;甚至无所不知。 但你是否意识到&#xff0c;你的手机可能正在悄无声息地“监听”你的一举一动&#xff1f; 从你的搜索习惯到日常对话&#xff0c;手机的个性化推荐系统正不断收集你的数据。 本文…...

人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括了EMLo和transformer架构。此外,课程还详细…...

PicGo + gitee 免费搭建个人图床

目录 1 图床概念2 使用gitee和PicGo搭建图床流程2.1 下载安装PicGo工具 3 图片上传错误处理3.1 PicGo客户端提示404错误信息图片上传失败3.2 PicGo客户端提示400错误信息图片上传失败 1 图床概念 ​ "图床"是一个网络术语&#xff0c;它指的是一种用于存储和托管图片…...

组合数的低复杂度运算

题源 题目 F. 预期中位数 每次测试的时间限制&#xff1a;3 秒 每次测试的内存限制&#xff1a;256 兆字节 Arul 有一个长度为 n 的二进制数组* a。 他将取该数组中所有长度为 k&#xff08;k 为奇数&#xff09;的子序列并找到它们的中位数。 所有这些值的总和是多少&#xf…...

小型并网式光伏气象站:光伏电站的智能守护者

小型并网式光伏气象站以其独特的功能和优势&#xff0c;成为了电站高效运行的智能守护者。小型并网式光伏气象站通过精准的数据采集与分析&#xff0c;为光伏电站的运维管理提供了强有力的支持。 小型并网式光伏气象站能够实时监测并记录光伏电站周围环境的多种气象参数&#x…...

JavaScript 中的回调函数(callback)

JavaScript 中的回调函数&#xff08;callback&#xff09; JavaScript 中的回调函数&#xff08;callback&#xff09;是一个传递给另一个函数作为参数的函数&#xff0c;并且这个传递的函数可以在其他函数内部被调用执行。回调函数是异步编程的一个核心概念&#xff0c;特别…...

计算机毕业设计hadoop+spark+hive漫画推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据

HadoopSparkHive漫画推荐系统详细开题报告 一、引言 随着互联网技术的飞速发展&#xff0c;动漫和漫画产业的数据量急剧增长。用户面临着海量漫画作品的选择难题&#xff0c;如何从这些数据中高效地提取有价值的信息&#xff0c;为用户推荐符合其喜好的漫画作品&#xff0c;成…...

解决pycharm日志总是弹出“无法运行Git,未安装Git”的问题

需求分析 我电脑中安装了git&#xff0c;但是打开pycharm&#xff0c;右下角总是弹出 无法运行Git,未安装Git的日志。 解决方法 首先打开pycharm&#xff0c;按照以下路径&#xff0c;依次点击。 file -----settings-----version control -----Git----Git path(选择自己下载…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...