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

stack和queue的模拟实现

文章目录

  • 如何实现?
  • 实现stack
  • 实现queue
  • 总结

在这里插入图片描述

如何实现?

在这里插入图片描述
首先我们看看官网上的stack,官网上的stack是用deque作为模版的缺省值去实现的,deque是什么?
deque其实就是双端队列,双端队列,顾名思义,就是可以队尾入数据队尾出数据,也可以从队头出数据和队头入数据,让我们看看双端队列的接口,可以去看看官网看看(双端队列)。
双端队列就类似于队列和顺序表的结合版,不仅可以首插和尾插还支持[]随机访问。

实现stack

在学习C++的时候我们知道函数有缺省参数,那类比过来,其实模版也有缺省参数,我们马上要实现的stack就有模版参数。
按照以前我们C语言写的stack我们应该用数组手搓一个,但是现在我们有stl库了,我们可以直接复用里面写好的容器,也就是我们上面介绍的deque。

 template<class T, class Con = deque<T>>class stack{public: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:Con _c;};

我们直接复用STL里写好的接口,其实上面这种模式是一种设计方式,被称为容器适配器。
容器适配器的优点:

  1. 简化使用
    容器适配器提供了统一的接口,使得不同类型的容器类更易于使用。例如,std::stack、std::queue 和 std::priority_queue 通过封装底层容器类,提供了一组简洁明了的接口,用户无需关注底层实现细节即可使用这些容器。

  2. 隐藏实现细节
    容器适配器隐藏了底层容器类的实现细节。用户只需关注适配器提供的接口,而不需要了解底层容器类的具体实现。这有助于提高代码的可读性和可维护性。

  3. 提高代码可维护性
    由于容器适配器提供了统一的接口和抽象层,代码的可维护性得到了提高。如果底层容器类发生了变化,只需修改容器适配器的实现,而不需要修改使用适配器的代码。

  4. 代码复用
    通过使用容器适配器,可以实现代码复用。适配器封装了常见的容器操作,如 push、pop、top 等,避免了重复实现这些操作的需求,提高了代码的复用性。

实现queue

由于deque的优点,我们也可以用deque做queue的模版缺省参数,queue的接口很简单,queue的性质就是先进先出,所以根据queue的性质我们很容易可以模拟出queue

  template<class T, class Con = deque<T>>class queue{public:void push(const T& x){_c.push_back(x);}void pop(){_c.pop_front();}T& back(){return _c.back();}const T& back()const{return _c.back();}T& front(){return _c.front();}const T& front()const{return _c.front();}size_t size()const{return _c.size();}bool empty()const{return _c.empty();}private:Con _c;};
};

总结

通过对 C++ 中 stack 和 queue 的模拟实现,我们深入了解了容器适配器的工作原理和优势。这些适配器通过封装底层容器,提供了简洁而统一的接口,使得数据结构的操作变得更加直观和便捷。我们的模拟实现展示了如何利用已有的容器类来构建自定义的数据结构,同时也强调了代码复用和隐藏实现细节的重要性。

在实际开发中,选择合适的数据结构和容器适配器能够显著提升代码的可读性、可维护性和性能。因此,熟练掌握和灵活运用这些基础工具,是每一个 C++ 开发者必备的技能。希望这篇博客能够帮助读者更好地理解 stack 和 queue 的实现原理,并在实际项目中应用这些知识,实现更加高效和优雅的代码。

感谢大家的阅读,如果你有任何疑问或建议,欢迎在评论区留言讨论。

相关文章:

stack和queue的模拟实现

文章目录 如何实现&#xff1f;实现stack实现queue总结 如何实现&#xff1f; 首先我们看看官网上的stack&#xff0c;官网上的stack是用deque作为模版的缺省值去实现的&#xff0c;deque是什么&#xff1f; deque其实就是双端队列&#xff0c;双端队列&#xff0c;顾名思义&am…...

你的手机是如何控制你的手表之广播篇

前言 要让手机能够控制手表&#xff0c;第一步当然要让手机能够“看见”手表&#xff0c;人类作为上帝视角&#xff0c;我们是能够通过眼睛直接看见手机和手表的&#xff0c;但要让手机“看见”手表&#xff0c;就需要一端把自己的信息通过电磁波的形式发往空中&#xff0c;另…...

深入理解并发之LongAdder、DoubleAdder的实现原理

深入理解LongAdder、DoubleAdder的实现原理 本文主要通过LongAdder和DoubleAdder的源码&#xff0c;讲述一下其实现原理。通过LongAdder和DoubleAdder的源码可知。两者都是继承了Striped64的类。下面我们将通过源码的形式讲述一下这三个类都做了哪些事情。 1: Striped64 ​ …...

virtuoso原理图无法编辑

(SCH-1217): Could not open "XX schematic" for edit. (because it is locked by user XX on XX) Would you like to open it for read? 解决方法&#xff1a; 到工程目录的schematic文件夹下找到sch.oa.cdslck.RHEL30.XXX-eda.21423和sch.oa.cdslck全部删掉即可正…...

Kotlin协程中的作用域 `GlobalScope`、`lifecycleScope` 和 `viewModelScope`

Kotlin协程中的作用域 Kotlin协程提供了多种作用域来管理协程的生命周期&#xff0c;其中最常见的是 GlobalScope、lifecycleScope 和 viewModelScope。 1. GlobalScope GlobalScope 是一个全局作用域&#xff0c;不受任何其他生命周期的限制。这意味着在 GlobalScope 中启动…...

leetcode739 每日温度

题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 输入: tempe…...

【软件测试】自动化测试如何管理测试数据

前言 在之前的自动化测试框架相关文章中&#xff0c;无论是接口自动化还是UI自动化&#xff0c;都谈及data模块和config模块&#xff0c;也就是测试数据和配置文件。 随着自动化用例的不断增加&#xff0c;需要维护的测试数据也会越来越多&#xff0c;维护成本越来越高&#…...

Llama 3-V: 比GPT4-V小100倍的SOTA

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…...

Anaconda安装配置

Anaconda下载&#xff1a; 网盘下载&#xff1a;https://pan.quark.cn/s/c5663477ccef 配置环境变量&#xff1a; 以管理员身份运行命令提示符 setx /M PATH "%PATH%;C:\ProgramData\anaconda3;C:\ProgramData\anaconda3\Scripts;C:\ProgramData\anaconda3\Library\bi…...

全面理解渗透测试

揭秘网络安全的秘密武器&#xff1a;全面理解渗透测试 在数字化时代&#xff0c;网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发&#xff0c;给个人、企业和国家带来了巨大的损失。为了应对这一挑战&#xff0c;渗透测试作为一种重要的网络安全评估手段&#xff0…...

「网络编程」基于 UDP 协议实现回显服务器

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现回显服务器 &#x1f349;socket api&#x1f349;回显服务器&#x1f34c;实现&#x1f95d;服务器&#x1f95d;客户端 &#x1f3…...

云数融合与大数据技术在日常生活中的创新应用探索

前言 移动云模型服务产品在中国移动旗下主要包括云计算、大数据、人工智能等服务&#xff0c;它依托广泛的算力资源(4N31X)、丰富的网络接入资源和高品质云专网&#xff0c;实现算网端资源一站式开通&#xff0c;构建企业级一体化解决方案。 文章目录 前言云计算的日常应用智…...

ETCD 备份与还原

安装etcdctl 准备看下etcd如何命令行操作&#xff0c;才发现&#xff0c;主机上&#xff0c;只用kubeadm拉起了etcd&#xff0c;但没有etcdctl命令。 # sudo docker ps -a | awk /etcd-master/{print $1} c4e3a57f05d7 26a11608b270 836dabc8e254 找到正在运行的etcd&#xf…...

LeeCode 1787 DP

题意 传送门 LeeCode 1787 使所有区间的异或结果为零 题解 任一个元素都至多对 k k k个长度为 k k k的区间产生影响&#xff0c;故难以直接依次处理每一个元素。 观察到满足条件的数组中模 k k k意义下索引相等的各个元素相同&#xff0c;故可以依次处理每一个同余类。 d p…...

如何有效屏蔽手机上的骚扰电话20240530

如何有效屏蔽手机上的骚扰电话 引言 最近&#xff0c;我的手机经常接到954开头的7位数字座机电话&#xff0c;这些骚扰电话让我非常困扰。由于我经常点外卖&#xff0c;无法屏蔽所有陌生号码&#xff0c;因此需要一个既能屏蔽特定前缀的骚扰电话&#xff0c;又不影响日常生活…...

Linux CGroup资源限制(概念限制进程CPU使用)

Linux CGroup资源限制&#xff08;详解&#xff09; 最近客户认为我们程序占用cpu过高&#xff0c;希望我们限制&#xff0c;排查之后发现是因为程序频繁gc导致&#xff0c;为了精细化、灵活的的限制&#xff0c;想到了使用Linux CGroup。 0 前置知识 ①概念及作用 官网&#…...

Latex中标注通讯作者

** 直接使用脚注&#xff0c;不用添加宏包 多个同地址的并列&#xff0c;建议加点空格&#xff0c;好看一些 ** \title{xxxxxxxxxxxxxxxxxxx}\author{xxxxxxxxxxxxxxxxxxx\footnote{Corresponding author} ,bbbbbbbbbbbbbbbbbbb}\address{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…...

PyQt5开发笔记:1.环境搭建与界面美化

推荐视频教程&#xff1a; https://www.bilibili.com/video/BV1LT4y1e72X?p23&vd_source7ab611f3afb3d469faad93d3996f99ba 一、打开网址&#xff0c;点击下载 https://build-system.fman.io/qt-designer-download 下载后&#xff0c;点开exe 不推荐&#xff1a;http…...

公派/自费访问学者申请出国访学的常见问题解答(下)

06、学术背景和研究成果要求&#xff1f; 访学是面向学术单位和企事业单位开放的。 针对学术单位&#xff0c;比如高校与科研院所&#xff0c;学科内涉及的论文发表&#xff0c;课题研究&#xff0c;专利&#xff0c;著作&#xff0c;含金量较高的奖项等背景都是国外比较看重…...

完全指南:C语言学习资源汇总

C语言是编程学习的基石&#xff0c;无论是为了职业发展还是个人兴趣&#xff0c;掌握C语言都是技术生涯的重要一步。为了帮助初学者和有经验的程序员更好地学习和深化对C语言的理解&#xff0c;我们汇总了一系列优秀的书籍和在线资源。这些资源将帮助你从基础知识到高级概念&am…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...