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

线性数据结构的基本概念(数组,链表,栈,队列)

数组

数组由相同类型的元素组成,使用一块连续的内存来存储。
数组的特点是:
1.利用索引进行访问
2.容量固定
3.使用一块连续的内存来存储
各种操作的时间复杂度:
查找/修改:O(1)//访问特定位置的元素
插入:O(n )//最坏的情况发生在插入发生在数组的首部并需要移动所有元素时
删除:O(n)//最坏的情况发生在删除数组的开头发生并需要移动第一元素后面所有的元素时

链表简介

链表使用的不是连续的内存空间来存储

链表的插入和删除操作的复杂度为 O(1)
查询或者访问特定位置的节点的时候复杂度为 O(n) 。

链表相比于数组会占用更多的空间,因为链表中每个节点存放的还有指向其他节点的指针

链表分类

常见链表分类:
单链表。单向链表只有一个方向,结点只有一个指针 next 指向后方的节点

在这里插入图片描述

循环链表。循环链表和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点
在这里插入图片描述

双向链表。双向链表 包含两个指针,prev 指向前一个节点, next 指向后一个节点
在这里插入图片描述

双向循环链表。双向循环链表 尾节点的 next 指向头节点,而头节点的 prev 指向最后一个节点
在这里插入图片描述

数组 vs 链表

  • 数组支持随机访问,而链表不支持。
  • 数组使用连续的内存空间来存储,链表则相反。
  • 数组的大小固定,而链表则支持动态扩容。如果初始声明的数组过小,后续需要申请一个更大的数组,然后将原数组拷贝进去,浪费时间

栈简介

只允许栈顶( top)进行加入数据(push)和移除数据(pop)。按照 后进先出(LIFO, Last In First Out) 的原理运作。

栈常用一维数组或链表来实现,用数组实现的栈叫作 顺序栈 ,用链表实现的栈叫作 链式栈

应用场景

  1. 实现浏览器的回退和前进功能
    只需要使用两个栈(Stack1 和 Stack2)和就能实现这个功能。比如你按顺序查看了 1,2,3,4 这四个页面,我们依次把 1,2,3,4 这四个页面压入 Stack1 中。当你想回头看 2 这个页面的时候,你点击回退按钮,我们依次把 4,3 这两个页面从 Stack1 弹出,然后压入 Stack2 中。假如你又想回到页面 3,你点击前进按钮,我们将 3 页面从 Stack2 弹出,然后压入到 Stack1 中。
  2. 深度优先遍历(DFS)
    在深度优先搜索过程中,栈被用来保存搜索路径,以便回溯到上一层

队列简介

队列(Queue)先进先出 (FIFO) 的线性表。在具体应用中通常用链表或者数组来实现,用数组实现的队列叫作 顺序队列 ,用链表实现的队列叫作 链式队列队列只允许在后端(rear)进行插入操作也就是入队(enqueue),在前端(front)进行删除操作也就是出队(dequeue)

队列的常见应用场景

当我们需要按照一定顺序来处理数据的时候可以考虑使用队列这个数据结构。

  • 阻塞队列:当队列为空的时候,出队操作阻塞,当队列满的时候,入队操作阻塞。使用阻塞队列我们可以很容易实现“生产者 - 消费者“模型。
  • 广度优先搜索(BFS),在图的广度优先搜索过程中,队列被用于存储待访问的节点,保证按照层次顺序遍历节点

队列的分类

有无固定大小划分:

有界队列
有固定大小的队列
常见的有界队列:
ArrayBlockingQueue

常见的无界队列为:
指的是没有设置固定大小的队列。
1)ConcurrentLinkedQueue 无锁队列,底层使用CAS操作,通常具有较高吞吐量,但是具有读性能的不确定性,弱一致性——不存在如ArrayList等集合类的并发修改异常,通俗的说就是遍历时修改不会抛异常

2)PriorityBlockingQueue 具有优先级的阻塞队列

3)DelayedQueue 延时队列,使用场景
根据阻塞/非阻塞划分

阻塞队列
当生产者向队列中生产数据时,若队列已满,那么生产线程会暂停,直到队列中有空闲;而当消费者向队列中获取数据时,若队列为空,则消费者线程会暂停,直到容器中有元素出现

非阻塞队列
与阻塞队列相反,非阻塞队列的执行并不会被阻塞,无论是消费者的出队,还是生产者的入队。
在底层,非阻塞队列使用的是CAS(compare and set)来实现线程执行的非阻塞

根据存储结构划分

链式队列
链式队列内部使用单向链表来实现。它的好处的是灵活,队列容量理论上是不受限制的。
循环队列
循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
顺序队列
队列是只允许在一端进行插入操作,在另外一段进行删除操作的线性表,先进先出(First In First Out)
双端队列
双端队列两端都可以删除元素和插入元素。双端队列用双向链表实现。
顺序队列和链式队列都属于单向队列

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React Hooks 的高级用法
  • 多商户多套部署需修改注意事项
  • 便携式气象监测设备的定义与特点
  • python锁 (lock) 机制+多线程处理共享变量
  • 希尔排序,详细解析(附图解)
  • yolov8旋转框+关键点检测
  • XSS GAME
  • 记录一个变量溢出的bug
  • Hive3:常用查询语句整理
  • gitlab
  • 知识竞赛答题设备及答题方式有哪些
  • 什么是应用交付控制器(ADC)
  • 【ML+DL 基础知识】信息瓶颈
  • Mybatis(面试篇)
  • git fetch和git pull的区别
  • ES6简单总结(搭配简单的讲解和小案例)
  • Sass 快速入门教程
  • Vim Clutch | 面向脚踏板编程……
  • Vue 重置组件到初始状态
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 多线程事务回滚
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 规范化安全开发 KOA 手脚架
  • 简单实现一个textarea自适应高度
  • 理解在java “”i=i++;”所发生的事情
  • 七牛云假注销小指南
  • 微服务框架lagom
  • 小程序 setData 学问多
  • 正则表达式小结
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 《天龙八部3D》Unity技术方案揭秘
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (python)数据结构---字典
  • (Python第六天)文件处理
  • (二十四)Flask之flask-session组件
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)php投票系统 毕业设计 121500
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • .“空心村”成因分析及解决对策122344
  • .Net 6.0--通用帮助类--FileHelper
  • .net Application的目录
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET实现之(自动更新)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...