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

【C++】Stack

在这里插入图片描述

个人主页~


Stack

  • 一、Stack的介绍和使用
    • 1、stack的介绍
    • 2、stack的使用
    • 3、stack的模拟实现
  • 二、容器适配器
    • 1、什么是适配器
    • 2、容器适配器的使用
  • 三、deque
    • 1、原理介绍
    • 2、deque的使用
    • 3、deque的缺陷

一、Stack的介绍和使用

1、stack的介绍

stack详细解释

stack是一种容器适配器,专门用来处理后进先出操作,其删除只能从容器的一端进行元素的插入和提取操作

stack是作为容器适配器被实现的,容器适配器是对特定类封装为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部被压入和弹出

stack的底层容器可以是任何标准的容器类模版或者一些其他特定的容器类,这些容器都要支持empty判空、back获取尾部元素、push_back尾部插入元素、pop_back尾部删除元素的操作,这些是stack的基本接口

标准容器vector、list、deque均符合这些要求,如果没有指定stack的底层容器,默认为deque,这其中只有deque没有学习过,后面拿一个段落专门解释deque

2、stack的使用

函数说明接口说明
stack构造空的栈
empty检测stack是否为空
size返回stack中的元素个数
top返回栈顶元素的引用
push将元素val压入stack中
pop将stack中尾部的元素弹出
void test_stack()
{stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << endl;st.pop();}
}

在这里插入图片描述

手感火热做道题

最小栈
解题思路:就是创建两个栈st和minst,st栈存放数据,minst栈存放最小值,第一个入st栈的直接入minst栈,每次入st栈都与minst栈的top比较一下是不是更小,如果数小就入minst栈

class MinStack 
{
public:MinStack() {}//空构造构造空栈void push(int val) {if(minst.empty() || val <= minst.top()){minst.push(val);}st.push(val);}//如果minst栈为空或者入栈的值小于等于minst的栈顶元素就入minst栈void pop() {if(st.top() == minst.top()){minst.pop();}st.pop();}//如果删除st栈顶元素与minst栈顶的元素相等就连minst栈顶元素一块删除int top() {return st.top();}int getMin() {return minst.top();}
//因为minst是被比较出来的,越往上的元素越小,所以栈顶元素就是最小的元素stack<int> st;stack<int> minst;
};

栈的压入、弹出序列
这个题就是写一个栈弹出顺序是否正确的函数,传给两个vector,然后pushV元素压入栈,然后取栈顶元素与popV的第一个元素进行对比,如果相同就出栈,如果不同就继续入栈,最后如果pushV遍历完后栈为空,那么就正确,否则就错误

bool IsPopOrder(vector<int>& pushV, vector<int>& popV) 
{stack<int> st;size_t pushi = 0,popi = 0;//用于记录pushV、popV的下标while(pushi < pushV.size())//如果下标小于size循环继续{st.push(pushV[pushi++]);//pushV元素压入栈while(!st.empty() && st.top() == popV[popi]){st.pop();popi++;}//然后取栈顶元素与popV的第一个元素进行对比,如果相同就出栈}return st.empty();
}

3、stack的模拟实现

stack.h

在这里插入图片描述

#pragma once#include <vector>
#include <deque>
#include <list>
#include <iostream>namespace little_monster
{template<class T,class Container = std::deque<T>>class stack{public:stack(){}void push(const T& x){_c.push_back(x);}void pop(){_c.pop_back();}T& top(){return _c.back();}const T& top() const{return _c.back();}size_t size() const{return _c.size();}bool empty() const{return _c.empty();}private:Container _c;};
}

在这里插入图片描述
在这里插入图片描述

stack可以通过vector为底层实现,也可以通过list为底层实现,直接调用这些模版的接口就可以,不用在从零开始定义成员变量了

这里的Container以及deque是什么呢

二、容器适配器

1、什么是适配器

适配器是一种设计模式,该种设计模式是将一个类的接口转换成用户希望的另外一个接口,适配器可以接受不同的容器来达到用户想要的效果,而stack和queue的默认适配器是deque,priority_queue的默认适配器是vector

2、容器适配器的使用

常见于stack、queue、priority_queue、优先队列中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、deque

相关文档

1、原理介绍

deque是一种双开口的连续空间的数据结构,可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素,与list比较,空间利用率比较高

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组

双端队列底层是一段假想的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上

偷一张详解图
在这里插入图片描述
首先我们可以看到start迭代器,它由四个指针组成,cur表示当前位置,first表示第一个位置,last表示最后一个位置,node是指向map的其中一个变量

当cur等于last时,node指向下一个位置,然后cur、first、last都重置到下一个map元素,在图中就是cur、first指向8,last指向15后一个位置

当start迭代器中的node和finish迭代器中的node相同时,该数组就是最后一个数组

然后这个map其实是一个指针数组,它进行扩容时是从中间向两端地存储,如果我们进行头插,start指向的数组又满了,我们就在start前面的位置再开一个数组,并且把数据存储在这个数组的最后一个位置

2、deque的使用

void test_deque()
{std::deque<int> dq;dq.push_back(3);dq.push_back(4);dq.push_front(2);dq.push_front(1);for (size_t sz = 0; sz < dq.size(); sz++){std::cout << dq[sz] << " ";}std::cout << std::endl;
}

在这里插入图片描述

3、deque的缺陷

它不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某小段小空间的边界,导致效率低下,因此在实际中,需要线性结构时,大多数优先使用vector和list,但我们知道的一个应用就是STL中做stack和queue的底层数据结构

它结合了vector和list的部分优点,也得到了它们的部分缺点,与vector相比,deque的优势是头插头删和扩容时,不需要搬移元素,效率高,与list比较,其底层是连续的空间,空间利用率较高


今日分享就到这里~

在这里插入图片描述

相关文章:

【C++】Stack

个人主页~ Stack 一、Stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现 二、容器适配器1、什么是适配器2、容器适配器的使用 三、deque1、原理介绍2、deque的使用3、deque的缺陷 一、Stack的介绍和使用 1、stack的介绍 stack详细解释 stack是一种容器适配器…...

“药乡”怀化,按下产业向海“加速键”

怀化&#xff0c;这座被火车拖来的城市&#xff0c;拥有什么独特的产业优势吗&#xff1f; 很多人不知道的是&#xff0c;怀化在整个医药领域可是大名鼎鼎的“中国道地药材之乡”&#xff0c;中药材资源蕴藏量居湖南省第一。尤其是怀化靖州&#xff0c;这里年集散茯苓11万吨&a…...

【AWDP】 AWDP 赛制详解应对方法赛题实践 量大管饱

文章首发于【先知社区】&#xff1a;https://xz.aliyun.com/t/15535 一、AWDP概述 AWDP是什么 AWDP是一种综合考核参赛团队攻击、防御技术能力、即时策略的攻防兼备比赛模式。每个参赛队互为攻击方和防守方&#xff0c;充分体现比赛的实战性、实时性和对抗性&#xff0c;对参…...

读构建可扩展分布式系统:方法与实践05分布式缓存

1. 分布式缓存 1.1. 缓存存在于应用程序的许多地方 1.1.1. 行应用程序的CPU具有高速多级硬件缓存&#xff0c;可以减少相对较慢的主内存访问 1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容&#xff0c;这样在许多情况下查询就可以不用访问速度相对较慢的磁盘 1.2. …...

【逐行注释】自适应Q和R的AUKF(自适应无迹卡尔曼滤波),附下载链接

文章目录 自适应Q的KF逐行注释的说明运行结果部分代码各模块解释 自适应Q的KF 自适应无迹卡尔曼滤波&#xff08;Adaptive Unscented Kalman Filter&#xff0c;AUKF&#xff09;是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波&#xff08;Unscented Kalman Filter&am…...

OpenCV高阶操作

在图像处理与计算机视觉领域&#xff0c;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下&#xff0c;采样 下采样&#xff08;Downsampling&#xff09; 下采样通常用于减小图像的…...

Vue中的防抖和节流是什么,它们的作用是什么?

在Vue.js中&#xff0c;防抖&#xff08;debounce&#xff09;和节流&#xff08;throttle&#xff09;是两种常用的性能优化技术&#xff0c;主要用于处理高频事件&#xff0c;如窗口滚动、窗口大小调整、键盘输入等。 **防抖&#xff08;Debounce&#xff09;**&#xff1a;…...

C++的类与对象中(主讲默认成员函数)

目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造&#xff08;调用编译器自动生成的默认构造函数&#xff09; 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…...

C#学习系列之Gmap地图界面上的实时绘制问题

C#学习系列之Gmap地图界面上的实时绘制问题 前言总结 前言 在地图控件上增加绘制不规则图形&#xff0c;在之前的经验来看&#xff0c; System.InvalidOperationException:“无法使用 DependencyObject&#xff0c;它属于其父 Freezable 之外的其他线程。” 其实就是ui线程中…...

Spring Boot中实现定时任务的主要方式

文章目录 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&#xff1a;1. 使用Scheduled注解2. 使用Quartz调度器使用Quartz调度器(更好的做法)3. 使用TaskExecutor和ScheduledExecutorService4.总结 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&a…...

C#使用HttpWebRequest下载文件

public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpDownloadFile--准备以HTTP的方式下载文件&#xff0c;url:[" downloadUrl &…...

Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?

文章目录 问题试验mpstat问题 最近看一个问题,看到一个虚拟机分配的cpu是:3-4,27-28 Cpus_allowed: 0000,18000018 Cpus_allowed_list: 3-4,27-28 使用top看qemu-kvm进程的cpu usage是:13.3%: [root@qrms6-host01 14278]# top -p 14278 top - 01:19:35 up 4 days...

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…...

MySQL行锁的实践

在MySQL中&#xff0c;根据加锁的粒度&#xff0c;可以将数据库的锁细分为表锁、行锁、页锁。其中&#xff0c;表锁(Table Lock)是一种粗粒度的锁&#xff0c;它锁定整个表&#xff0c;阻止其他事务访问表中的任何行&#xff1b;行锁(Row Lock)是一种细粒度的锁&#xff0c;它锁…...

iOS 18 將在 9 月 16 日正式上線

現在有了正式的上線日期了。一如往常的&#xff0c;它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能&#xff0c;不過並非所有的 iPhone 機種都能享用&#xff0c;而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...

css选择器有几种?选择器的优先级是怎样的?

CSS选择器的主要分类 元素选择器&#xff08;Type Selectors&#xff09;&#xff1a;选择HTML文档中的特定类型的元素。 示例&#xff1a;p { color: red; } 类选择器&#xff08;Class Selectors&#xff09;&#xff1a;选择具有指定类名的元素。 示例&#xff1a;.myClass …...

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…...

kafka之protobuf

Protobuf 的 .proto 文件是一种描述消息结构的定义文件&#xff0c;使用这种文件可以定义数据结构&#xff08;消息&#xff09;&#xff0c;然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义&#xff0c;然后通过 protoc 编译…...

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构&#xff1a; BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器&#xff08;Encoder&#xff09;模型&#xff0c;它使用了Transformer的编码器部分来处理输入的文本&#xff0…...

C++ 11新特性(1)

文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto&#xff1f; decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...