线性表【队列、栈】(包括顺序存储结构和链式存储结构【链表】)
单链表和顺序存储结构优缺点.jpg线性表:零个或多个数据元素的有限序列。
线性表的顺序储存结构的优缺点.jpg
线性表的顺序存储结构:指的是用一段地址连续的存储单元一次存储线性表的数据元素。
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。
链表:为了表示每个数据元素Ai与其直接后继数据元素Ai+1之间的逻辑关系,对数据元素Ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称做指针或链。这两部分信息组成数据元素Ai的存储映像,称为结点
。n个结点链结成一个链表
,即为线性表的链式存储结构。
链表分为单向链表、双向链表、循环链表。
单向链表 | 双向链表 | 循环链表 |
---|---|---|
链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 | 它的每个数据结点中都有两个指针分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 | 将单链表中中断结点的指针端由空指针改为指向头结点,就是整个单链表形成一个环,这种头尾详解的单链表叫做循环链表。 |
说到链表,那么就会存在头指针和头结点的概念。
|头指针 | 头结点
----|-----|-----
定义|链表中第一个结点的存储位置叫做头指针。|单链表的第一个结点前附设一个结点,称为头结点。
异同|- 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。- 头指针具有标示作用,所以常用头指针冠以链表的名字。- 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。|- 头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表长度)。- 有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了。 - 头结点不一定是链表必须要素。
队列、栈
|栈|队列
----|----|----
定义|限定仅在表尾进行插入和删除操作的线性表。|只允许一端进行插入操作,而在另一端进行删除操作的线性表。
数据(逻辑)结构|线性结构|线性结构
数据操作|栈又称为LIFO的线性表。LIFO结构。|队列是一种FIFO的线性表。FIFO结构。
存储结构|分为顺序存储和链式存储。|分为顺序存储和链式存储。
重要概念|两栈共享空间|循环队列
- 他们均可以用线性表的顺序存储结构来实现,但都存在着顺序存储的一些弊端,因此他们各自有各自的技巧来解决这个问题。
- 对于栈来说,如果两个相同数据类型的栈,则可以用数组的两端作栈底的方法来让两个栈共享数据,这就可以最大化地利用数组的空间。
- 对于队列来说,为了避免数组插入和删除时需要移动数据,于是就引入循环队列,使得队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗,使得本来插入和删除是O(n)的时间复杂度编程了O(1)。
网友评论