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

【STL】stack与queue的底层原理及其实现

文章目录

  • stack的介绍
  • 库中stack的使用
  • 栈的模拟实现
  • queue的介绍
  • 库中queue的使用
  • queue的模拟实现

stack的介绍

在这里插入图片描述
在这里插入图片描述
(图片来自知乎)

1.stack是一种容器适配器,模拟了栈的数据结构。数据只能从一端进去,另一端出来(先进后出)。
2.stack适配器默认是由deque容器实现的,也可以显示要求stack的底层封装的容器类型。由于栈的特性,arrayforward_list不能用来构造stack适配器
3.stack的底层容器必须需要支持以下几个操作:
(1) empty:判空操作
(2)back:获取尾部元素操作
(3)push_back:尾部插入元素操作
(4)pop_back:尾部删除元素操作
这也意味着,即使底层封装的容器可能不一样,但我们能以统一的视角去看待以及操作stack

对栈这种数据结构不了解的同学可以去看:
C语言模拟栈和队列

库中stack的使用

通过查看手册我们能看到stack有以下成员函数:
在这里插入图片描述

在c++98中,stack并没有显示设计自己的构造函数。作为适配器,使用编译器默认的构造函数即可,因为默认的构造函数会调用自定义类型成员的构造。析构也是如此。

empty()
在这里插入图片描述
stack是否为空取决于,底层封装容器对象是否为空。stack的empty()实际上是在调用底层容器的empty()。这一点在stack的其它成员函数也类似。
给出stack的常用函数功能:
在这里插入图片描述

栈的模拟实现

尝试用vector作为底层容器来模拟栈。

#define _CRT_SECURE_NO_WARNINGS 1
#include<vector>template<class T,class Container = std::vector<T> >
class stack {
public://默认构造函数会自动调用自定义类型成员变量的构造函数//默认析构函数会自动调用自定义类型成员变量的析构函数size_t size() {return _con.size();}bool empty() {return _con.empty();}void push(const T& val) {_con.push_back(val);}T top() {return _con[_con.size() - 1];}void pop() {_con.pop_back();}void swap(stack<T>& x) {_con.swap(x._con);}private:Container _con;
};

在这里插入图片描述

我们可以发现,这种用一种现成的容器去实现另一种容器的方式是非常方便且灵活的!帮我们节省了非常多的代码。这同样也是容器适配器的作用之一!

queue的介绍

在这里插入图片描述

在这里插入图片描述
(来自百度)

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素(先进先出)。
    2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
    3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    (1) empty:检测队列是否为空
    (2)size:返回队列中有效元素的个数
    (3)front:返回队头元素的引用
    (4)back:返回队尾元素的引用
    (5)push_back:在队列尾部入队列
    (6)pop_front:在队列头部出队列
    4.标准容器类dequelist满足了这些要求(不能构造于vector之上)。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque
    对队列这种数据结构不了解的同学可以去看:
    C语言模拟栈和队列

库中queue的使用

在这里插入图片描述

queue的模拟实现

#include<deque>template<class T, class Container = std::deque<T> >
class queue {
public://默认构造函数会自动调用成员变量的构造函数//默认析构函数会自动调用成员变量的析构函数size_t size() {return _con.size();}bool empty() {return _con.empty();}void push(const T& val) {_con.push_back(val);}T front() {return _con.front();}T back() {return _con.back();}void pop() {_con.pop_front();}void swap(stack<T>& x) {_con.swap(x._con);}private:Container _con;
};

在这里插入图片描述

相关文章:

【STL】stack与queue的底层原理及其实现

文章目录 stack的介绍库中stack的使用栈的模拟实现queue的介绍库中queue的使用queue的模拟实现 stack的介绍 &#xff08;图片来自知乎&#xff09; 1.stack是一种容器适配器&#xff0c;模拟了栈的数据结构。数据只能从一端进去&#xff0c;另一端出来&#xff08;先进后出&am…...

Ai大模型如何应用到机器视觉系统中

AI大模型在机器视觉系统中的应用可以通过以下几个步骤实现&#xff1a; 1. 数据准备与预处理&#xff1a; - 收集和标注大量高质量的图像数据&#xff0c;这些数据应该覆盖机器视觉系统需要处理的各种场景和对象。 - 对图像数据进行预处理&#xff0c;包括去噪、标准化、增强等…...

IntelliJ IDEA下载及安装教程(Windows操作系统)

一、下载IntelliJ IDEA 1、访问JetBrains官方网站 打开浏览器&#xff0c;输入网址 https://www.jetbrains.com/idea/ 进入IntelliJ IDEA官方主页。 2、选择产品版本 IntelliJ IDEA分为免费的Community Edition&#xff08;社区版&#xff09;和付费的Ultimate Edition&…...

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…...

pdf图片识别分类

文章目录 解析pdf数据ocr识别分类方法正则匹配词频统计分类模型 分类完提示 解析pdf数据 试了几种方法 fitz-get_image后面方法不适用&#xff0c;用pixmap分辨率低 用pypdf2版本低方法用不了 用pdf2image还要下依赖工具 用spire.pdf的SaveAsImage分辨率低&#xff0c;Extract…...

24双非考研哈尔滨工程大学计算机(@程程笔记)

前言 个人情况&#xff0c;本科双非考研软件工程。24考研成绩总分369(政治75&#xff0c;英语58&#xff0c;数学102&#xff0c;专业课134)&#xff0c;整体各科成绩比较均衡&#xff0c;没有太突出和瘸腿的&#xff0c;初始排名5/19&#xff0c;复试后排名5/13。 政治 政治…...

IO流(2.其他流)

能够高效读写的缓冲流&#xff0c;能够转换编码的转换流&#xff0c;能够持久化存储对象的序列化流 一、缓冲流 缓冲流,也叫高效流&#xff0c;是对4个基本的FileXxx 流的增强&#xff0c;所以也是4个流&#xff0c;按照数据类型分类&#xff1a; 字节缓冲流&#xff1a;Buffe…...

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…...

layui后台框架,将左侧功能栏目 集中到一个页面,通过上面的tab切换 在iframe加载对应页面

实现上面的 功能效果。 1 html代码 <form class"layui-form layui-form-pane" action""><div class"layui-tab" lay-filter"demo"><ul class"layui-tab-title"><li id"a0" class"lay…...

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;ServerSocket API&#x1f338;Socket API &#x1f340;TCP中的长短连接&#x1f333;建立TCP回显客户端与服务器&#x1f338;TCP搭建服务器&#x1f338;TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API &#x1f384;…...

Hadoop生态系统主要是什么?

Hadoop生态系统主要由以下几部分组成&#xff1a; Hadoop HDFS&#xff1a;这是Hadoop的核心组件之一&#xff0c;是一个用于存储大数据的分布式文件系统。它可以在廉价的硬件上提供高度的容错性&#xff0c;通过数据复制和故障切换实现数据的高可用性。 MapReduce&#xff1a…...

GlusterFS分布式文件系统

前言 存储可分为文件存储和对象存储&#xff0c;常见的文件存储相关技术有&#xff1a;nfs、lvm、raid&#xff1b;常见的对象存储相关技术有&#xff1a;gfs、ceph、fdfs、nas、oss、s3、switch。GlusterFS 归类为文件存储系统&#xff0c;它提供了一种强大的方式来管理和存储…...

spark本地模拟多个task时如何启动多个Excutor

1、首先在9090端口下启动Excutor,作为第一个Excutor 2、然后修改9090端口为&#xff1a;9091&#xff0c;如下图点击Edit Configration 3、然后按下图操作 &#xff0c; 4、修改一下名字 5、点击apply&#xff0c;&#x1f197; 6、检查下面圈1是否是刚刚我们新建的MyExcutor(2…...

RocketMQ笔记(八)SpringBoot整合RocketMQ广播消费消息

目录 一、简介1.1、消费模式 二、消费者2.1、maven依赖2.2、application配置2.3、消费监听 三、生产者3.1、发送消息3.2、运行结果 四、其他 一、简介 在之前的文章中&#xff0c;我们讲过了&#xff0c;同步发送单条消息&#xff0c;异步发送单条消息&#xff0c;发送单向消息…...

Appium如何自动判断浏览器驱动

问题&#xff1a;有的测试机chrome是这个版本&#xff0c;有的是另一个版本&#xff0c;怎么能让自动判断去跑呢&#xff1f;&#xff1f; 解决办法&#xff1a;使用appium的chromedriverExecutableDir和chromedriverChromeMappingFile 切忌使用chromedriverExecutableDir和c…...

MVCC-多版本并发控制

MVCC&#xff08;多版本并发控制&#xff09;简介 在数据库系统中&#xff0c;并发控制是一个非常重要的话题。为了提高系统的并发性能和吞吐量&#xff0c;现代数据库系统通常使用多种技术来实现对数据的安全访问&#xff0c;其中一种重要的技术就是多版本并发控制&#xff0…...

c++找最高成绩

根据给定的程序&#xff0c;写成相关的成员函数&#xff0c;完成指定功能。 函数接口定义&#xff1a; 定义max函数&#xff0c;实现输出最高成绩对应的学号以及最高成绩值。 裁判测试程序样例&#xff1a; #include <iostream> using namespace std; class Student{…...

前端saas化部署

在项目中难免会遇到一些特殊的需求&#xff0c;例如同一套代码需要同时部署上两个不同的域名A和B。A和B的不同之处仅在于&#xff0c;例如一些背景图片&#xff0c;logo&#xff0c;展示模块的不同&#xff0c;其他业务逻辑是和展示模块是完全一样的。此时我们当然可以考虑单独…...

[Java基础揉碎]Math类

目录 基本介绍 方法一览(均为静态方法) 1) abs 绝对值 2) pow 求幂 3) ceil 向上取整 4) floor 向下取整 5) round 四舍五入 6) sqrt 求开方 7) random求随机数 8) max 求两个数的最大值 9) min 求两个数的最小值 基本介绍 Math类包含用于执行基本数学运算的方法&…...

MyBatis输入映射

1 parameterType parameterType&#xff1a;接口中方法参数的类型&#xff0c;类型必须是完全限定名或别名&#xff08;稍后讲别名&#xff09;。该属性非必须&#xff0c;因为Mybatis框架能自行判断具体传入语句的参数&#xff0c;默认值为未设置&#xff08;unset)。<sel…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...