02.数据结构与算法之线性表、堆栈和队列

1.抽象数据类型(Abstract Data Type)

抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。

最常用的数据运算有五种:

  • 插入
  • 删除
  • 修改
  • 查找
  • 排序

2.线性表:是具有相同数据类型的n(n>=0)个数据元素的有限序列记为(a1, a2, ... ,ai-1, ai, ai+1, ... ,an),n为表长。

  线性表的基本操作:线性表的初始化,求线性表的长度,取元素,按值查找,插入操作,删除操作。

  2.1、顺序表:线性表的顺序存储是指在内存中用地址连续的一块空间顺序存放线性表的各元素

    设ai的存储地址为Loc(ai),每个数据元素占d个存储单元,则第i个数据元素的地址为:Loc(ai)=Loc(ai)+(i-1)*d       1<=i<=n

    也就是说,只要知道顺序表首地址和每个数据元素所占地址单元的个数就可以求出第i个数据元素的地址,即顺序表具有按数据元素的序列号随机存取的特点。

  顺序表的基本运算:顺序表的初始化,插入运算,删除运算,按值查找,

  2.2、链表:线性表的链式存储是指将元素存放在通过链接构成的一系列存储块中

    链表是通过一组任意的存储单元来存储线性表中的数据元素的,为了建立起数据元素之间的线性关系,对每个数据元素ai,除了存放数据元素的自身信息ai之外,还需要和ai一起存放其后续元素ai+1所在的存储单元的地址,这两部分信息组成一个“结点”,每个元素都如此。data域称为数据域,用来存放数据元素的信息;next域称为指针域,用来存放其后继元素的地址信息。因此,n个元素的线性表可以通过每个结点的指针域拉成一个“链”,称之为链表。因为每个结点中只有一个指向后继的指针,所以称其为单链表

对于单链表而言,最后一个结点的指针域是空指针,如果将该链表头指针置入该指针域,则使得链表头尾相连,就构成了单循环链表

对于单链表而言,每个结点再加一个指向前驱的指针域,用这种结点组成的链表称为双向链表

链表的基本运算:建立单链表,求表长,查找操作,插入,删除,

3.顺序表和链表的对比

4.选择哪一种链表通常由实际问题中的主要因素决定。

  “较稳定”的线性表选择顺序存储,

  而频繁插入、删除等“动态性”较强的线性表选择链式表。

特殊线性表:堆栈

5.堆栈(后进先出)的定义是限制在表的一端进行插入和删除的线性表,简称为栈。允许插入、删除的这一端称为栈顶,另一端称为栈底。当表中没有元素时称为空栈。

利用顺序存储方式实现的栈称为顺序栈。

利用链式存储方式实现的栈称为链栈。通常链栈用单链表来表示,因此其结点结构与单链表结构相同。

栈中主要操作是栈顶的插入和删除。

6.队列(先进先出)定义:插入在表一端进行,删除在表的另一端进行。这种数据结构称为队或者队列,把允许插入的一端叫队尾,把允许删除的一端叫队头。

顺序存储的队列称为顺序队列。因为队列的队头和队尾都是活动的,因此,除了队列的数据区还有队头、队尾两个指针。

链式存储的队列称为链式队列。用单链表来实现链队列。根据先进先出原则,为了操作上的方便,分别需要一个头指针和尾指针。其实这就是一个带上尾指针的单链表,只要被它的操作按照队列的规则进行,它就是一个链队列。

7.总结

原文地址:https://www.cnblogs.com/kaid/p/8684365.html