Tiven

Tiven

博观而约取,厚积而薄发

天问的个人网站(天问博客),专注于Node.js、Vue.js、React、Vite、Npm、Nginx等大前端技术。不断学习新技术,记录日常开发问题,持续分享coding,极客开源,共同进步。生命不息,奋斗不止... [ hexo blog ]

【数据结构与算法】(5):数组、栈、链表、队列结构与对比


在程序中经常需要使用到 数组、栈、链表、队列 等数据结构,本文就介绍一下这些数据结构的特点与复杂度分析。

数据结构与算法 · 数组、栈、链表、队列

一、数组

数组是一种 线性 数据结构,它由一系列相同类型的元素组成,这些元素在内存中是连续存储的。数组的特点包括:

  • 数组是物理结构,是一个真正的功能实现,受限于编程语言
  • 随机访问:由于数组中的元素在内存中是连续存储的,因此可以通过索引直接访问任意位置的元素。
  • 固定大小:数组的大小在创建时就确定了,并且无法动态改变。
  • 插入和删除元素的效率较低:由于数组的大小固定,插入和删除元素时需要移动其他元素。
  • 数组适用于需要快速访问元素,并且元素数量固定的场景,例如存储一组学生的成绩。
  • 算法复杂度:查询快 O(1),新增和删除快 O(n)

二、栈

栈是一种 后进先出LIFO)的数据结构,它的特点包括:

  • 栈是逻辑结构,是一个理论模型,不管如何实现,不受任何语言的限制
  • 只能在栈顶进行插入和删除操作。
  • 插入和删除元素的效率较高。
  • 栈的大小可以动态改变。
  • 栈适用于需要按照特定顺序处理数据的场景,例如函数调用栈、表达式求值等。

三、链表

链表是一种 动态 数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的特点包括:

  • 链表是一种物理结构(非逻辑结构),类似于数组
  • 数组需要一段连续的内存区间,而链表是零散的
  • 链表节点的数据结构 { value, next?, prev? }
  • 随机访问效率较低,需要从头节点开始遍历。
  • 插入和删除元素的效率较高,只需要修改节点的指针。
  • 链表的大小可以动态改变。
  • 链表适用于需要频繁插入和删除元素的场景,例如实现队列、树等数据结构。
  • 算法复杂度:查询慢 O(n),新增和删除快 O(1)

四、队列

队列是一种 先进先出FIFO)的数据结构,它的特点包括:

  • 队列是逻辑结构,是一个理论模型
  • 只能在队尾插入元素,在队头删除元素。
  • 插入和删除元素的效率较高。
  • 队列的大小可以动态改变。
  • 队列适用于需要按照特定顺序处理数据的场景,例如任务调度、消息传递等。

五、对比

下表列出了数组、栈、链表和队列的特点和适用场景的对比:

数据结构 随机访问 插入/删除效率 大小可变性 适用场景
数组 固定 快速访问
可变 特定顺序处理
链表 可变 频繁插入/删除
队列 可变 特定顺序处理

六、总结

根据不同的需求,我们可以选择合适的数据结构来提高程序的效率和性能。 总结起来有以下几点:

  • 数组适用于需要快速访问元素的场景
  • 栈适用于特定顺序处理数据的场景
  • 链表适用于频繁插入和删除元素的场景
  • 队列适用于特定顺序处理数据的场景

《数据结构与算法》系列

  1. 什么是算法复杂度
  2. 堆(heap)、栈(stack)、队列(queue)
  3. 把一个数组旋转k步
  4. 判断字符串是否括号匹配
  5. 数组、栈、链表、队列结构与对比
  6. 用两个栈实现一个队列
  7. 反转单向链表
  8. 用链表实现队列
  9. 二分查找
  10. 查找两数之和

欢迎访问:天问博客