图解栈(Stack)与队列(Queue)


数据结构

身为程序猿或者攻城狮,你肯定知道数据结构这个东西的。而数据结构却有好几种类型,我简单罗列下:

  1. 数组(Array)

  2. 栈(Stack)

  3. 队列(Queue)

  4. 链表(Linked List)

  5. 树(Tree)

  6. 图(Graph)

  7. 堆(Heap)

  8. 散列(Hash)

以上,数据结构一般有以下几种常用运算:

  1. 检索。检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。

  2. 插入。往数据结构中增加新的节点。

  3. 删除。把指定的结点从数据结构中去掉。

  4. 更新。改变指定节点的一个或多个字段的值。

  5. 排序。把节点按某种指定的顺序重新排列。例如递增或递减。


栈和队列的结构特点

对于这几种数据结构,在嵌入式软件开发中最为常用的是数组、栈和队列。其中数组最为简单了,是一种基础数据结构。如果我今天讲解数组,也许觉得太简单了浪费你的时间,可能会拍我砖头。于是,我今天打算图解栈和队列。


  • 是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。

  • 队列
    队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。

为了直观地表达这两种结构的特性,我们来两个图示:

栈:


队列:


从上面两个图可以看出,的出入口只有一个,而列的入口和出口是分开的。我们就用两个专业名称来说明这两个特性,后进先出(LIFO)和先进先出(FIFO)。

很明显,栈是LIFO,而队列是FIFO。

对于栈,我们姑且将放入数据称为Push(压栈),取出数据称为Pop(出栈);

为了区别栈的方式,对于队列,我们将放入数据称为EnQueue,取出数据称为DeQueue

以下详细分解图示来讲解下:



以下是放入数据的过程:

  1. Push第1个数据1

  2. Push第2个数据2

  3. Push第3个数据3


以下是取出数据的过程:

  1. Pop第1个数据4

  2. Pop第2个数据2

  3. Pop第3个数据1


栈的实用案例

从结构特点看来,栈数据结构没毛作用(那是因为不会用)。假设产品需要显示一个存储设备上文件列表,你会怎么做呢?



有两条路:

  • 深度优先BFS(Breadth-First-Search)
    即先搜索第1个文件夹的最深层文件夹(子文件夹的子文件夹的……)里面的文件,然后再返回上一层文件夹搜索。例如上图的,先搜索文件夹Folder11里的文件,在返回到Folder1里面搜索其下面的第2个文件夹,以此类推。

  • 广度优先DFS(Depth-First-Search)
    即先搜索第1个文件夹下的文件,再搜索其下面子文件夹的文件。例如上图的,先搜索FolderRoot下面的文件,再搜索Folder1的文件,然后Folder2……

先不讨论哪条路比较好,姑且要按深度优先来,怎么做?

递归,其实这种方法很直观,反正遇到文件夹下面有文件夹就打开搜,直到没有文件夹为止。但是在嵌入式软件上开发,递归是非常低效的,对系统的栈内容要求非常大。

那么还有其他方法吗?有,那就数据结构。

以上图文件结构为例:

  1. 以FolderRoot为起始(设置为当前搜索路径),搜索其下面的内容

  2. 从当前搜索路径开始,搜索其内容,并判断每个条目

  3. 遇到文件夹就将其Push到栈

  4. 遇到文件就做相应处理

  5. 直到搜索并判断完当前目录下所有条目

  6. 将栈内容Pop出来,重复 第2点, 如没有,就结束。

具体过程如下:

Push Folder: FolderRoot
Pop Folder : FolderRoot
Get File   : FolderRoot/File1
Get File   : FolderRoot/File2
Push Folder: FolderRoot/Folder1
Push Folder: FolderRoot/Folder2
Push Folder: FolderRoot/Folder3
Pop Folder : FolderRoot/Folder3
Push Folder: FolderRoot/Folder3/Folder31
Pop Folder : FolderRoot/Folder3/Folder31
Get File   : FolderRoot/Folder3/Folder31/File311
Pop Folder : FolderRoot/Folder2
Get File   : FolderRoot/Folder2/File21
Get File   : FolderRoot/Folder2/File22
Pop Folder : FolderRoot/Folder1
Get File   : FolderRoot/Folder1/File11
Get File   : FolderRoot/Folder1/File12
Get File   : FolderRoot/Folder1/File13
Push Folder: FolderRoot/Folder1/Folder11
Push Folder: FolderRoot/Folder1/Folder12
Pop Folder : FolderRoot/Folder1/Folder12
Get File   : FolderRoot/Folder1/Folder12/File121
Pop Folder : FolderRoot/Folder1/Folder11
Get File   : FolderRoot/Folder1/Folder11/File111


队列

队列有好几种,如内存地址连续的线性队列和地址不连续的链式队列,队列又可以做成环形队列(或者叫循环队列)

线性队列:

链式队列:

环形队列:

这图长得太挫了,看这个:


在实际运用中,最多的应该是这个环形队列,如果队列的缓冲区大小能很好地平衡收入和取出的数据,就给人一种取之不尽用之不竭的感觉。

以下是放入数据的过程:

  1. EnQueue第1个数据1

  2. EnQueue第2个数据2

  3. EnQueue第3个数据3


以下是取出数据的过程:

  1. DeQueue第1个数据1

  2. DeQueue第2个数据2

  3. DeQueue第3个数据3

实际上队列里面一个元素并不是只限制一个字节数据,可以使一块数据

队列里面的数据还可以动态大小,要注意在数据块里面能找到计算方式即可,例如定义一个length

队列的实用案例

队列使用的更加广泛,例如:

  1. FreeRTOS里面Task之间的数据传输用的就是队列


  2. 通信过程中数据接收可以用队列做缓存


  3. 上一章节的文件搜索例子,如果是广度优先搜索可以使用队列
    这个不画图了,读者自己思考下?

什么?你想要看源码?这个我还真没准备。

  1. 实现个简单的Stack和Queue并不难,实际应用的还要考虑互斥等

  2. 网上很多,各种版本都有,但建议你严加测试再使用

想获取更多内容,请关注微信公众号“嵌入式软件实战派”



嵌入式软件实战派 专注嵌入式软件开发领域知识传授,包括C语言精粹,RTOS原理与使用,MCU驱动开发,AUTOSAR搭建,软件架构方法设计等。
评论
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 459浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 427浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 419浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 446浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 415浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 88浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 144浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 420浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 430浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 53浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 317浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦