目录
线性表:
线性表:是最基本的线性结构的一种抽象,主要的基本运算有插入、删除、查找。有顺序存储和链式存储两种存储方式。
1,线性表的定义:
一个线性表是n个元素构成的有限序列(n>=0),可表示为(a1,a2,a3,a4·············,an),对于长度大于0的线性表,有以下特点:
1>,存在唯一的一个称作“第一个”的元素;
2>,存在唯一的一个称作“最后一个”的元素;
3>,除第一个元素外,序列中的每个元素均只有一个前驱;
4>,除最后一个元素外,序列中的每个元素均只有一个直接后继。
2,顺序存储:
是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素在物理地址上也相邻。
优点:可以随机存取表中的元素;
缺点:插入和删除操作需要移动元素。
3,链式存储:
用结点来存储数据元素,表中元素的结点地址可以连续,也可以不连续,所以,数据元素和元素之间的逻辑关系都要存储。
链表中结点的基本结构如下所示:
数据域 | 指针域 |
数据域用于存储数据元素的值;指针域则存储当前元素的直接前驱或(和)直接后继的位置信息,指针域中的信息称为指针(或链)。
线性链表(单链表):n个结点通过指针连成一个链表,结点中只有一个指针域。
双向链表:每个结点包含两个指针,分别指示当前元素的直接前驱和直接后继,可在两个方向上遍历链表中的元素。
循环链表:表尾结点中的指针指向链表的第一个结点,可从表中任意结点开始遍历整个链表。
静态链表:借助数组来描述链式存储结构。
优点:插入和删除操作不需要移动元素;
缺点:只能顺序地访问元素,而不能对元素进行随机存取(单指线性链表(单链表))。
栈和队列:
栈按“后进先出”的规则进行操作;队列按“先进先出”的规则进行操作。
栈:(后进先出,先进后出)是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。
进行插入和删除操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。不含数据元素的栈称为空栈。
2,基本运算:
1>,初始化栈initStack(S):创建一个空栈S;
2>,判栈空isEmpty(S):当栈S为空栈时返回“真”,否则返回“假”;
3>,入栈push(S,x):将元素x加入栈顶,并更新栈顶指针;
4>,出栈pop(S):将栈顶元素从栈中删除,并更新栈顶指针;
5>,读栈顶元素top(S):返回栈顶元素的值,但不修改栈顶指针。
3,栈的顺序存储:是指用一组地址连续的存储单元作为栈的存储空间,同时设置指针top指示栈顶元素的位置。采用顺序存储结构的栈也称为顺序栈。
4,栈的链式存储:为了克服顺序存储的栈可能存在上溢的不足(顺序存储是提前指定存储空间的大小,链式存储则是存储在物理空间的各个位置,通过指针域进行连接),可以用链表存储栈中的元素。用链表作为存储结构的栈也称为链栈。
队列:是一种先进先出的线性表,只允许在队列的一端插入元素,而在另一端删除元素。
在队列中,允许插入元素的一端称为队尾(Rear),允许删除元素的一端称为队头(Front)。
2,基本运算:
1>,初始化队列initQueue(Q):创建一个空的队列Q;
2>,判队空isEmpty(Q):当队列为空时返回“真”,否则返回“假”;
3>,入栈enQueue(Q,x):将元素x加入队列Q的队尾,并更新队尾指针;
4>,出栈deQueue(Q):将队头元素从队列Q中删除,并更新队头指针;
5>,读栈顶元素frontQueue(Q):返回队头元素的值,但不更新队头指针。
3,队列的顺序存储:是指用利用一组地址连续的存储单元存放队列中的元素。由于队中元素的插入和删除限定在两端进行,因此设置队头指针和队尾指针,分别指示出当前的队首元素和队尾元素。
当出队操作导致队列变为空时,就有Q.rear == Q.front;(判空条件)
当入队列操作导致队列满,则也有Q.rear == Q.front。(判满条件)
4,队列的链式存储:也称为链队列,为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点。
队列为空的判定条件是头指针和尾指针相同,且均指向头结点。
串:
是一串文字及符号的简称,是一种线性表。字符串中的元素是字符。源程序和目标程序都是字符串。
串是仅由字符构成的有限序列,是取值受限的线性表。一般记为S = 's1s2s3s4s5·······sn'(注意这里是单引号),其中S是串名,单引号括起来的字符序列是串值。
串比较:两个串比较大小时以字符的ASCII值作为依据。
数组:
数据元素数目固定,数据元素具有相同的类型,数据元素的下标关系具有上下界的约束且下标有序。
在数组中通常有两种操作:
1,取值操作
2,赋值操作