小肥柴慢慢手写数据结构(C篇)(4-3 关于栈和队列的讨论)

news2025/3/12 6:58:51

小肥柴慢慢学习数据结构笔记(C篇)(4-3 关于栈和队列的讨论)

  • 目录
    • 1 双端栈/队列
    • 2 栈与队列的相互转化
      • 2-1 栈转化成队列
      • 2-2 队列转化成栈
    • 3 经典工程案例
      • 3-1 生产者和消费者模型(再次重温环形缓冲区)
      • 3-2 MapReduce中的缓冲区对<k,v>键值对排序
    • 4 小结

目录

(本帖主要从形态上讨论线性表的一些共有特性,不涉及具体的编码环节)

1 双端栈/队列

(1)一般形态的讨论:经过大量编程训练后,不禁会有疑问:
【Q】为何ArrayList,LinkedList,Stack、Queue这四种基本形态以及它们的变种被统称为“线性表”呢?涉及到“双端”话题时,又应该如何正确理解呢?

【A】很多文献中总是给出大量的理论化论述,但是我认为可以简单的归纳如下:
(1)一个线性表两头都能进出。(注意红色箭头代表的数据进出方向。)
(2)可灵活设定元素增长方向:两头向中间 or 中间向两头;当然,都要处理越界/碰头问题。
(3)人们也习惯将带回绕的线性表当做一个环来看待。(老生常谈的话题,后续看案例。)
在这里插入图片描述
在这里插入图片描述
此时,在翻看双向链表的示意图,是不是更有味道了?
在这里插入图片描述

2 栈与队列的相互转化

这是一对经典的面试问题,在Leecode上有对应练习,大家可以试试看。

2-1 栈转化成队列

【Q】给定两个栈,你能否组装成一个队列?
【A】设置一个栈作入队用,另一个栈作出队用:
(1)入队直接压到输入栈。
在这里插入图片描述
(2)出队时:
<1> 若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈。
<2> 此时输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。
<3> 若输出栈不为空,直接弹出即可。
在这里插入图片描述

2-2 队列转化成栈

【Q】给你两个队列,你能否组装成一个栈?
【A1】常规解法
(1)queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。
(2)入栈操作时,首先将元素入队到queue2,然后将queue1的全部元素依次出队并入队到queue2,此时queue2的前端的元素即为新入栈的元素,再将queue1和queue2互换,则queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。
(3)由于每次入栈操作都确保queue1的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得queue1的前端元素并返回即可(不移除元素)。
(4)由于queue1用于存储栈内的元素,判断栈是否为空时,只需要判断queue1是否为空即可。
在这里插入图片描述
在这里插入图片描述
【A2】实际上,使用一个队列亦可:循环排队。
在这里插入图片描述
在这里插入图片描述

3 经典工程案例

3-1 生产者和消费者模型(再次重温环形缓冲区)

(1)数据消费者从队列中读取新的数据。
(2)数据生产者从队列中写入新的数据。
(3)只要读写操作速度协调,必然可以一直复用这段缓存。(溢写,spill机制)
在这里插入图片描述
【注】实际上把这个ring撇直了也没有那么神秘,不是吗?

3-2 MapReduce中的缓冲区对<k,v>键值对排序

在这里插入图片描述
【Q1】设想现在给你一个Byte数组(线性数据结构)如何把<k1,v1> ~ <kn,vn>n个键值对数据存入其中?
【Q2】此时若直接排序会导致频繁的内存腾挪(联想动态数组时我们实现的resize操作?),如何避免?

【A】在实际工程设计中,将数据转化为两部分的组合:
(1) 固定长度的<k,v>键值对。
(2)非固定长度meta元数据段。
(3)<k,v>键值对还存储了meta的起始位置。

为了提高buffer的利用率,考虑使用环形buffer,那么:
(1)index = 0处就相当于一条分割线,称为赤道(equator)。
(2)<k,v>和meta都以equator为起点,分别朝两个方向存放数据。
在这里插入图片描述
盗一张图,更加形象的表达
在这里插入图片描述
【效果】
(1)排序时仅需要调整<k,v>的顺序即可,极大减少内存腾挪。
(2)排序完成后,外部读取数据时,采用间接寻址能够以正确的顺序获取到完整的数据集合。

4 小结

本节着墨不多,但我认为只要图画的清楚,看图就能彻底领悟线性表的精髓:任意进出元素的巧用!当然,如果后续补全了树状数组话题的讨论(包括堆和树,特别是N叉树的代表B/B+树),整个知识体系正常看就完备了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java-单列模式-final-继承-多态

内存存储区域 引用变量和普通变量引用变量放在栈中&#xff0c;基本数据类型的内容是在堆内存中。 对象放在堆内存中&#xff0c;其引用变量放在栈中&#xff0c;指向堆内存存放对象的地址。 静态变量放在静态区中&#xff0c;静态变量在程序的执行始中中分配一次&#xff0c;…

基于杀伤链的勒索软件控制框架

40s说清楚勒索软件如何工作 基于杀伤链的勒索软件控制框架开发了4种缓解策略(预防、阻止、检测&响应、重建)&#xff0c;覆盖18个控制域90项控制措施&#xff0c;以正确管理与勒索软件攻击杀伤链各阶段相关的风险。 注&#xff1a;本文节选出自《基于杀伤链的勒索软件防御指…

Windows编程----结束进程

进程有启动就有终止&#xff0c;通过CreateProcess函数可以启动一个新的子进程&#xff0c;但是如何终结子进程呢&#xff1f;主要有四种方法&#xff1a; 通过主线程的入口函数&#xff08;main函数、WinMain函数&#xff09;的return关键字终止进程 一个应用程序只有一个入…

无标签数据增强+高效注意力GAN:基于CARLA的夜间车辆检测精度跃升

目录 一、摘要 二、引言 三、框架 四、方法 生成合成夜间数据 昼夜图像风格转换 针对夜间图像的无标签数据增强技术 五、Coovally AI模型训练与应用平台 六、实验 数据 图像风格转换 夜间车辆检测和分类 结论 论文题目&#xff1a;ENHANCING NIGHTTIME VEHICLE D…

SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、用法介绍三、方法列表四、使用案例五、调用存储过程六、in参数用法七、SqlServer带Go的脚…

NO.33十六届蓝桥杯备战|函数|返回值|声明|调用|引用|函数重载(C++)

返回值 我们在设计的函数的时候&#xff0c;函数在经过计算后&#xff0c;有时候需要带回⼀些计算好的数据&#xff0c;这时候往往使⽤return 来返回&#xff0c;这⾥我们就讨论⼀下使⽤ return 返回。 return 后边可以是⼀个数值&#xff0c;也可以是⼀个表达式&#xff0c;…

5G工业路由器赋能无人码头,港口物流智能化管理

全球贸易发展促使港口需提升运营效率&#xff0c;传统港口面临诸多难题&#xff0c;无人码头成为转型关键方向。5G 工业路由器为其提供有力通信支持&#xff0c;引领港口物流变革。 随着无人码头建设在全球兴起&#xff0c;如荷兰鹿特丹港、中国上海洋山港等。码头作业设备需实…

【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth&#xff1f;2. OAuth 2.0 是如何工作的&#xff1f;3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…

有关Java中的多线程

学习目标 ● 掌握线程相关概念 ● 掌握线程的基本使用 ● 掌握线程池的使用 ● 了解解决线程安全方式 1.为什么要学习线程? ● 从1946年2月14日世界上第一台计算机在美国宾夕法尼亚大学诞生到今天&#xff0c;计算和处理的模式早已从单用户单任务的串行模式发展到了多用户多…

【eNSP实战】配置交换机端口安全

拓扑图 目的&#xff1a;让交换机端口与主机mac绑定&#xff0c;防止私接主机。 主机PC配置不展示&#xff0c;按照图中配置即可。 开始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…

LLMs基础学习(一)概念、模型分类、主流开源框架介绍以及模型的预训练任务

文章目录 LLM基础学习&#xff08;一&#xff09;一、大语言模型&#xff08;LLMs&#xff09;的简单介绍定义与基本信息核心特点局限性参考的模型 二、大语言模型&#xff08;LLMs&#xff09;名称后 “175B”“60B”“540B” 等数字的含义数字代表模型参数数量具体示例参数数…

软件IIC和硬件IIC的主要区别,用标准库举例!

学习交流792125321&#xff0c;欢迎一起加入讨论&#xff01; 在学习iic的时候&#xff0c;我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢&#xff1f; 软件 IC&#xff08;模拟 IC&#xff09;和硬件 IC&#xff08;外设 IC&#xff09;是两种实现 IC 总线通信的方式…

4个 Vue 路由实现的过程

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; Vue 路由相信朋友们用的都很熟了&#xff0c;但是你知道 Vue 路由…

git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)

问题描述&#xff1a; 今天发现gitea仓库推送到某个镜像仓库的操作几个月前已经报错终止推送了&#xff0c;报错如下&#xff1a; 首先翻译报错提示可知是因为git仓库大小超过1G限制。检查本地.git文件&#xff0c;发现.git文件大小已达到1.13G。确定是.git文件过大导致&…

怎么利用DeepSeek进行PCB设计?

最近在琢磨利用Deepseek改善PCB的细节设计&#xff0c;毕竟立创EDA里面没有集成DS&#xff0c;因此&#xff0c;如何让DS能识别图片成了重中之重。所幸最近腾讯元宝里面集成了R1的满血版&#xff0c;这个版本可以上传图片&#xff0c;于是让DS识别图片就可能了。 在原理图设计…

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具&#xff0c;允许用户将 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;转换成多种格式&#xff0c;包括 Python 脚本&#xff08;.py&#xff09;、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert&#xff0c;也…

windows上传uniapp打包的ipa文件到app store构建版本

uniapp是一个跨平台的框架&#xff0c;使用windows电脑也可以开发ios软件&#xff0c;因为uniapp的打包是在云端实现的&#xff0c;本地电脑无需使用mac电脑即可完成打包。 但是打包后的ipa文件需要上架到app store的构建版本上&#xff0c;没有mac电脑&#xff0c;又如何上架…

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

在QGraphicsItem中&#xff0c;pos()和scenePos()是两个重要的方法&#xff0c;用于描述图形项的位置&#xff0c;但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义&#xff1a;pos()返回的是QGraphicsItem在…

消防设施操作员考试备考:以技巧为翼,翱翔知识天空​

消防设施操作员考试的备考过程中&#xff0c;掌握实用技巧能让学习事半功倍。以下为您介绍一系列备考技巧&#xff0c;助您在知识的天空中自由翱翔。​ 记忆技巧&#xff1a;化繁为简​ 消防知识众多&#xff0c;记忆难度较大。可以采用多种记忆方法&#xff0c;如口诀记忆法…