软件设计师考试 | 第三章 数据结构 | 线性结构

线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。
特点是数据元素间呈现一种线性关系,即元素“一个接一个排列”。

(一)线性表

常采用顺序存储和链式存储。

1.线性表的定义

一个线性表是n(n>=0)个元素的有限序列,通常表示为(a1,a2,...,an)
特点:

  • 存在唯一的一个称作是“第一个”的元素;
  • 存在唯一的一个称作“最后一个”的元素;
  • 除第一个元素外,序列中的每个元素均只有一个直接前驱;
  • 除最后一个元素外,序列中的每个元素均只有一个直接后继。

2.线性表的存储结构

线性表的存储结构分为顺序存储和链式存储。

(1)顺序存储

顺序存储:指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
使用这种存储方式,元素间的逻辑关系无须占用额外的空间来存储。
存储位置计算,第i个元素ai的存储位置:

LOC(ai)=LOC(a1)+(i-1)*L

其中,L是表中每个元素所占空间的字节数。

优缺点:

  • 优点
    可以随机存取表中的元素
  • 缺点
    插入和删除操作需要移动元素

(2)链式存储

链式存储:是用通过指针链接起来的结点来存储数据元素。
基本的节点结构如下所示:

数据域 指针域

其中数据域用于存储数据元素的值,指针域存储当前元素的直接前驱或直接后继的位置信息,指针域中的信息称为指针(链)。

存储各数据元素的结点的地址不要求连续,因此在存储数据元素的同时必须存储元素之间的逻辑关系。

在链式存储结构下进行插入和删除,其实质是对相关指针的修改。
根据结点中指针域的设置方式,链表分为:

  • 单向链表,结点中只有一个指针域;
  • 双向链表,每个结点包含两个指针,分别指出当前元素的直接前驱和直接后继;
  • 循环列表,在单向链表(或双向链表)的基础上令表尾结点的指针指向链表的第一个结点,构成循环链表,特点是可以从表中任意结点开始遍历整个链表;
  • 静态链表,借助数组来描述线性表的链式存储结构,用数组元素的下标表示元素所在结点的指针。

(二)栈和队列

栈和队列是程序中常用的两种数据结构,它们的逻辑结构和线性表相同,特点是运算有所限制。
是“后进先出(Last In First Out,LIFO)”,队列是“先进先出(First In First Out,FIFO)”。

1.栈

(1)栈的定义及基本运算

1)栈的定义

栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。
在栈中进行插入和删除操作的一端称为栈顶(Top),相应地,另一端称为栈底(Bottom)。不含数据元素的栈称为空栈。

2)栈的基本运算
  • 初始化栈:创建一个空栈S
  • 判断空:当栈S为空时返回“真”,否在返回“假”;
  • 入栈(push):将元素x加入栈顶,并更新栈顶指针;
  • 出栈(pop):将栈顶元素从栈中删除,并更新栈顶指针;
  • 读栈顶元素(top):返回栈顶元素的值,但不修改栈顶指针。

(2)栈的存储结构

1)顺序存储

栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设指针top指示栈顶元素的位置。
采用顺序存储结构的栈也成为顺序栈。

需要预先定义栈的存储空间,栈的空间容量有限。

2)栈的链式存储

用链表做为存储结构的栈也称为链栈。

不必另外设置头指针,链表的头指针就是栈顶指针。

3)栈的应用

栈的应用包括表达式求值,括号匹配等。
在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。

2.队列

(1)队列的定义及基本运算

1)队列的定义

队列是一种先进先出的线性表,它只允许在表的一端插入数据元素,而在表的另一端删除元素。
在队列中,允许插入元素的一端称为队尾(rear),允许删除元素的一端称为队头(front)。

2)队列的基本运算
  • 初始化队列:创建一个空的队列Q
  • 判读空:当队列为空时返回“真”,否则返回“假”;
  • 入队(EnQueue):将元素x加入到队列Q的队尾,并更新队尾指针;
  • 出队(DelQueue):将队头元素从队列Q中删除,并更新队头指针;
  • 读队头元素:返回队头元素的值,但不更新队头指针。

(2)队列的存储结构

1)队列的顺序存储

队列的顺序存储结构又称为顺序队列,它是利用一组地址连续的存储单元存放队列中的元素。
由于队列中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指出当前的队头和队尾。

元素出队时只修改队头指针;存储空间提前设定,所以队尾指针会有一个上限值。

2)队列的链式存储

队列的链式存储也称为链队列。
为了便于操作,给链队列添加一个头结点,并令头指针指向头结点。
因此,队列为空的判断条件时头指针和尾指针的值相同,并且均指向头结点。

(3)队列的应用

队列机构常用于处理需要排队的场合,例如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。


(三)串

串(字符串)是一种特殊的线性表,其数据元素为字符。
在计算机运算时,常把一个串作为一个整体来处理。

1.串的定义及基本运算

(1)串的定义

串是仅由字符构成的有限序列,是一种线性表。

(2)串的几个基本概念

  • 空串:长度为零的串,不包含任何字符;
  • 空格串:由一个或多个空格组成的串;
  • 子串:由串中任意长度的连续字符构成的序列;

(3)串的基本操作

  • 赋值操作:将串s的值赋给串t
  • 连接操作:将串t接续在串s的尾部,形成一个新串;
  • 求串长:返回串s的长度;
  • 串比较:比较两个串的大小;
  • 求子串:返回串s中从start开始的,长度为len的字符序列。

2.串的存储结构

  • 顺序存储结构
    用一组地址连续的存储单元来存储串值的字符序列
  • 链式存储结构
    每个结点中可以存储一个字符,也可以存储多个字符,要考虑存储密度的问题

3.串的模式匹配

子串的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一。
子串也称为模式串。

(1)朴素的模式匹配算法

也称为布鲁特-福斯算法。
基本思想是从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐一对字符进行后续的比较,否则从主串第二个字符起与模式串的第一个字符重新比较,直到模式串中每个字符依次和主串中一个连续的字符序列相等时为止,此时称为匹配成功,若不能在主串中找到与模式串相同的子串,则匹配失败。

(2)改进的模式匹配算法

又称为KMP算法
当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。


你可能感兴趣的:(软件设计师考试 | 第三章 数据结构 | 线性结构)