线性表
顺序表
基本概念:
线性表是有n(n>=0) 个数据元素所构成的有限序列。
特点:
- 在线性表中逻辑上相邻的数据元素,在物理存储位置上也是相邻的。
- 存储密度高,但要预先分配“足够应用”的存储空间,这可能会造成存储空间的浪费。其中,存储密度=(数据元素本身值所需的存储空间)/(该数据元素实际所占用的空间)
- 便于随机存取。
- 不便于插入和删除。因此插入和删除会引起大量元素的移动。 应用: 场合:线性表的长度基本可以预估且变化较小的情况。 java和c语言的数组,底层是运用了线性表的数据结构进行存储,我们使用数组通常是用来进行存取,很少用来进行插入和删除。
链表
基本概念:
采用链式存储的方式存储线性表,称为链表。
特点:
- 不需要预先分配内存,存储的位置不要求连续
- 每一个节点包含了一个用来存储数据的空间和一个用来指向下一个节点所在位置。
- 便于增加和删除,不需要移动大量数据。
- 不便于存取,因为不能通过下标找到对应的存储位置,因此无论是根据下标还是值进行查找,都需要从头开始进行比较。 应用: 场合:线性表的长度变化较大或长度难以估计。 java中的linkList集合
栈
基本概念:
栈是一种特殊的线性表,栈中的数据元素以及数据元素之间的逻辑关系和线性表的相同,使用顺序表来存储的,称为顺序栈,使用链表来存储的,称之为链栈。 表与栈的区别在于,栈的插入和删除只能在表的尾端进行,即栈顶进行。 栈的插入称为入栈,栈的删除称为出栈。
顺序栈与链栈的主要区别在于存储的形式上,顺序栈需要一段连续的存储空间,编译期需要确定数组大小,可能会出现栈溢出的现象。但是链栈不需要连续的存储空间,且可以动态分配内存大小,不会出现栈溢出问题。其实他们的区别主要就是存储方式不同造成的。
特点:
- 先进后出
- 每次出栈入栈只能在栈顶进行
应用:
- 函数递归调用中的地址和参数值的保存
- 文本编辑器中undo序列的保存
- 网页访问历史的记录保存
- 在编译软件设计中的括号匹配及表达式求值
- 等等。。。
队列
基本概念:
队列是一种特殊的线性表,队列可以分为顺序队列,循环队列和链队列。同理,不同的队列最主要的区别还是在于存储方式的不一样。 顺序队列采用的是顺序表进行存储。
循环队列是在顺序队列的基础上,将队列的首尾进行连接,形成一个环形,用来解决队列出队之后,可能造成的一种“假溢出”的问题。所谓假溢出指的是,存储空间没有满但是无法再插入数据。原因是队列在出队(删除)的情况下,队首的指针会向队尾方向移动,导致删除到最后,队首指针会指向队尾,插入数据的时候就表示没有空间了,其实前面出队的元素之前所占的空间都是空的。因此出现了循环队列来解决这个问题。 链队列采用了链表进行存储。
队列与链表的区别:
队列只允许在表尾(队尾)插入数据元素,在表头(队首)删除数据。类似排队,具有先进先出的特点。 顺序队列与链队列的区别: 同样也是存储方式的差异产生的区别。 顺序队列需要分配一块连续地址的存储区域来依次存放队列中的所有元素。 链队列不需要一块连续的存储区域。
特点:
- 先进先出
- 队首出队,队尾入队
应用:
- 操作系统中各种数据缓冲区的先进先出管理
- 应用系统中各种任务请求的排队管理
- 软件设计中对树的层次遍历和对图的广度遍历过程
优先级队列
基本概念:
优先级队列是一种带有优先级的队列,是一种比栈和队列更为专用的数据结构。最主要的区别在于优先级队列中数据元素按关键字的值有序排序。
应用:
- 构造哈夫曼树算法
- 某些计算机系统中优先级队列
栈与队列比较
相同点:
- 都是线性结构,级数据元素之间具有“一对一”的逻辑关系
- 插入操作都限制在表尾
- 都可在顺序存储结构和链式存储结构上实现
- 在时间代价上,插入和删除操作都需要常数时间;在空间代价上,情况也相同。
- 多链栈与多链队列的管理模式可以相同。
不同点:
- 删除数据元素操作的位置不同。栈是在表尾删除,队列在表头删除。
- 两者应用的场合不同。具有后进先出的特性的应用可以使用栈,例如递归点用中现场信息,计算的中间结果和参数值的保存,图与树的深度优先搜索遍历。 具有先进先出的特性的应用可以使用队列。例如消息缓冲管理,操作系统中内存,打印机等各种资源进行管理,图和树的广度搜索。
- 顺序栈可以实现多栈空间共享,但是顺序队列不同。多栈空间共享指的是,多个栈使用同一个存储空间,给两个栈分配了一个很大的存储空间,分别把这两个栈放在空间的两端,让栈顶都指向中间,由于栈是单向的,因此他们只会往中间延伸,形成空间互补,提高存储空间的利用率。