嵌入式系统中的常见数据结构:从理论到应用


前言

在嵌入式系统开发中,选择合适的数据结构是优化性能和内存使用的关键。嵌入式系统通常资源有限,具有严格的实时性要求,因此需要根据不同的应用场景选择和设计适当的数据结构。本篇博客将探讨几种嵌入式系统中常用的数据结构,解释其原理以及实际应用。

具体代码的实现可以转到
我的github
我的gitee


一、线性表(Linear List)

定义

线性表是一种按顺序存储的元素集合,通常以数组的形式实现。它通过索引直接访问元素,适合用于有固定长度的存储需求。

优点

  • 访问速度快:数组是一种随机访问结构,可以通过索引在 O(1) 时间内访问任意位置的元素。

缺点

  • 插入和删除效率低:在线性表中,插入或删除元素往往需要移动大量数据,导致 O(n) 的时间复杂度。

应用场景

在嵌入式系统中,线性表常用于存储固定数量的传感器数据或事件缓冲。对于嵌入式的音频处理系统,线性表(数组)可以用于存储一段时间内的音频数据,便于后续处理。

二、链表(Linked List)

定义

链表是一种动态数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。链表不需要连续的内存空间,适合在嵌入式系统中动态分配内存。

链表的常见形式包括:

  • 单链表:每个节点只包含一个指向下一个节点的指针。
  • 双链表:每个节点包含指向前后两个节点的指针。
  • 循环链表:链表的最后一个节点指向第一个节点,形成循环。

优点

  • 动态扩展:链表可以在运行时动态分配内存,不必提前定义大小。
  • 插入和删除效率高:链表的插入和删除操作仅需修改指针,时间复杂度为 O(1)。

缺点

  • 访问速度慢:链表无法通过索引直接访问元素,必须从头开始遍历,访问时间复杂度为 O(n)。

应用场景

  • 动态任务队列:在嵌入式操作系统中,链表常用于实现动态任务队列或事件队列。每个任务或事件可以作为一个节点动态添加或移除,避免频繁的内存分配问题。
  • 内存池管理:链表用于嵌入式系统中的内存池管理,通过链表动态分配和回收固定大小的内存块。

三、堆栈(Stack)

定义

堆栈是一种后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。堆栈的常见操作有:

  • 压栈(Push):将元素放入栈顶。
  • 出栈(Pop):将栈顶元素移出。

优点

  • 操作简单:堆栈的操作非常高效,只需在栈顶进行插入和删除操作,时间复杂度为 O(1)。

缺点

  • 只能访问栈顶元素,无法随机访问其他元素。

应用场景

  • 递归调用管理:在嵌入式系统中,堆栈用于管理函数调用的返回地址和局部变量。递归调用通过堆栈保存返回地址,实现多层函数调用。
  • 中断服务:中断处理时,嵌入式系统会将当前寄存器状态和程序计数器保存到堆栈中,以便在中断结束后恢复。

四、队列(Queue)

定义

队列是一种先进先出(FIFO)的数据结构,意味着最先进入队列的元素最先出队。在嵌入式系统中,常见的队列实现是循环队列,它有效利用了数组的内存空间,避免内存浪费.
队列的基本操作包括:

  • 入队(Enqueue):将元素插入队尾。
  • 出队(Dequeue):从队头移除元素。

优点

  • 顺序处理:适合按顺序处理任务或事件,确保先到先处理。

缺点

  • 插入和删除操作只能在队尾和队头进行。

应用场景

  • 任务调度:嵌入式系统通常使用实时操作系统(RTOS),队列用于管理任务调度。任务根据优先级或到达顺序插入队列,系统按顺序执行这些任务。
  • 数据缓冲:例如在串行通信(如UART)中,数据通过中断或DMA传输时,会被存入队列中暂存,避免数据丢失或阻塞。

五、哈希表(Hash Table)

定义

哈希表是一种通过哈希函数将键映射到数组的特定位置的数据结构,常用于快速查找和插入操作。

优点

  • 查找速度快:哈希表的查找、插入和删除操作平均时间复杂度为 O(1)。

缺点

  • 冲突处理:当两个键映射到相同的位置时,可能需要额外的冲突处理机制(如链表法或开放寻址法)。

应用场景

  • 查找表:嵌入式系统中,哈希表可以用于查找硬件寄存器的地址或系统配置参数。
  • 通信协议管理:哈希表可用于管理网络协议中的会话数据。例如,物联网设备中的设备信息或连接状态可以通过哈希表快速查找。

六、图(Graph)

定义

是一种由顶点和边组成的数据结构,常用于表示网络或路径关系。图可以是有向的或无向的,顶点之间可以有多条边。

优点

  • 灵活性高:图可以表示多种复杂的关系,如一对多、多对多、环状、网状等结构。
  • 多样化的数据表示:图的表示方式丰富,可以使用邻接矩阵或邻接表等方式来适应不同场景的性能需求。邻接矩阵适合稠密图,而邻接表适合稀疏图。

缺点

  • 复杂度较高:图的结构较为复杂,处理顶点和边的关系需要更多的计算资源和存储空间,尤其是对于大型稠密图。对于嵌入式系统这种资源有限的环境,使用图需要谨慎权衡性能和空间开销。

应用场景

  • 网络拓扑:在嵌入式网络系统(如物联网)中,设备之间的连接关系可以用图来表示。图的结构有助于嵌入式设备之间的数据通信和网络路径规划。
  • 路径规划:在机器人或无人机的导航系统中,图用于表示环境中的路径和障碍物,图算法用于寻找最短路径。

总结

在嵌入式系统中,选择合适的数据结构能显著提升系统性能。本文介绍了常见的线性表、链表、堆栈、队列和哈希表,并给出了每种数据结构的应用场景和代码实现。合理使用这些数据结构将有助于嵌入式开发中的内存管理和任务调度。

希望这篇博客能帮助你理解并实践这些数据结构!

嵌入式系统软件设计数据结构》可作为从事嵌入式系统软件设计的电子技术人员自学"数据结构"的教材,也可供高等院校电子技术类专业本科生、研究生作为教学参考书。  根据嵌入式系统软件设计需要的“数据结构”知识编写而成。书基本内容有:常用线性数据结构嵌入式系统的实现和相关算法;树和图在嵌入式系统的实现和相关算法;排序和查找算法等。   本书从嵌入式系统的实际硬件环境出发,用通俗易懂的语言代替枯燥难懂的理论解释,结合嵌入式系统应用实例,使读者在比较轻松的条件下将“数据结构”的基本知识学到手。   本书可作为从事嵌入式系统软件设计的电子技术人员自学“数据结构”的教材,也可供高等院校电子技术类专业本科生、研究生作为教学参考书。 第1章 概述 11.1 数据结构的基本概念1 1.1.1 数据和信息1 1.1.2 数据元素1 1.1.3 数据对象2 1.1.4 数据结构2 1.2 逻辑结构2 1.2.1 线性结构2 1.2.2 树形结构3 1.2.3 图状或网状结构3 1.2.4 纯集合结构4 1.3 存储结构4 1.3.1 顺序存储4 1.3.2 链状存储4 1.3.3 索引存储5 1.3.4 散列存储6 1.4 算法7 1.4.1 算法的描述7 1.4.2 算法的特征8 1.4.3 算法的评价10 1.4.4 算法效率的衡量方法 11 1.4.5 算法的存储空间需求12 1.5 嵌入式系统软件数据结构的特点13 第2章 线性表14 2.1 线性表的定义14 2.1.1 线性表的逻辑结构定义14 2.1.2 线性表的运算15 2.2 顺序表15 2.2.1 顺序表的定义16 2.2.2 顺序表上的基本运算16 2.3 链表22 2.3.1 单链表22 2.3.2 循环链表35 2.3.3 双链表36 2.4 线性表的应用实例39 第3章 队列44 3.1 队列的定义44 3.1.1 队列的逻辑结构定义44 3.1.2 队列的基本运算44 3.2 循环队列45 3.2.1 顺序队列45 3.2.2 循环队列的概念47 3.2.3 循环队列的运算48 3.3 链队列51 3.3.1 链队列的定义51 3.3.2 链队列的基本运算52 3.4 队列的应用实例57 第4章 堆栈60 4.1 堆栈的定义60 4.1.1 堆栈的逻辑结构定义60 4.1.2 堆栈的基本运算60 4.2 堆栈的使用61 4.2.1 顺序栈61 4.2.2 链栈65 4.3 堆栈的应用实例69 第5章 串73 5.1 串的定义73 5.1.1 串的基本概念73 5.1.2 串的存储结构74 5.2 串的主要操作76 5.3 串的应用实例85 第6章 数组86 6.1 数组的定义86 6.1.1 N维数组的定义86 6.1.2 数组的存储方式87 6.1.3 数组元素的寻址88 6.2 稀疏矩阵的压缩存储89 6.2.1 三元组顺序表90 6.2.2 十字链表93 6.3 稀疏矩阵运算的上机体验96 6.4 数组的应用实例100 第7章 树与二叉树104 7.1 树的定义104 7.1.1 树的逻辑结构定义104 7.1.2 树的逻辑表示105 7.1.3 树的基本术语106 7.2 二叉树的定义106 7.2.1 二叉树的逻辑结构定义106 7.2.2 二叉树的性质108 7.3 二叉树的遍历108 7.3.1 二叉树的存储结构108 7.3.2 二叉链表的生成与输出110 7.3.3 遍历二叉树112 7.3.4 上机体验119 7.4 树的应用实例120 第8章 图124 8.1 图的定义124 8.1.1 图的逻辑结构定义1248.1.2 图的基本术语124 8.2 图的储存126 8.2.1 邻接矩阵存储126 8.2.2 邻接表存储128 8.3 图的遍历129 8.3.1 深度优先搜索遍历129 8.3.2 广度优先搜索遍历131 8.3.3 上机体验132 8.4 图的最小生成树134 8.4.1 生成树与最小生成树1348.4.2 普里姆算法134 8.4.3 克鲁斯卡尔算法138 8.4.4 上机体验140 8.5 最短路径141 8.5.1 路径的概念141 8.5.2 从一个顶点到其余各顶点的最短路径142 8.5.3 每对顶点之间的最短路径145 8.5.4 上机体验148 8.6 图的应用实例149 第9章 排序150 9.1 插入排序150 9.1.1 排序原理150 9.1.2 程序设计151 9.1.3 算法分析1539.2 选择排序153 9.2.1 排序原理153 9.2.2 程序设计154 9.2.3 算法分析155 9.3 冒泡排序156 9.3.1 排序原理156 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值