软件设计师-数据结构
数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构。
数据结构是算法设计的基础,设计合理的数据结构可使算法简单高效。
数据结构按逻辑关系分为线性结构和非线性结构。非线性结构又可分为树结构和图结构。
一、线性结构
线性结构的特点是数据元素之间呈现一种线性关系。即元素‘“一个接一个排列”
1、线性表
线性表是最简单、最基本、最常用的线性结构。
它有两种存储方法:顺序存储和链式存储,主要的基本操作是插入、删除、查找。
一个线性表有n(n>=0)个元素的有限序列 表(a1,a2,..,an)
非空线性表特点:
(1)存在唯一的‘“第一个元”素
(2)存在唯一的“最后一个”元素
(3)除第一个元素外,每个元素只有一个前驱
(4)除最后一个元素外,每个元素只有一个后继
线性表的存储结构:
1.1顺序存储
用一组地址连续的存储单元依次存储线性表中的数据元素,使逻辑上相邻的两个元素在物理位置上也相邻
优点是可随机存取表中任一个元素
缺点是插入删除需要移动元素
1.2链式存储
线性表的链式存储用结点来存储数据元素。
一个基本的结点结构:
数据域用来存储元素的值,指针域用来存储当前元素的直接前驱后继的位置信息,指针域中的信息称为指针或链
各元素结点的地址不需要连续,存储元素的同时必须存储元素间的逻辑关系
在链式存储结构中,只需要头指针(head)指向第一个结点,就可以顺序访问表中的任意一个元素
在链式存储结构中,进行插入和删除本质是对相关指针的修改
采用线性链表存储结构不能对数据元素进行随机访问,但插入和删除操作不需要移动元素
根据结点中指针域的设置方式,还有其他几种链表结构
双向链表:每个结点包含两个指针,分别指出当前结点元素的直接前驱和后继。特点是从表的任意结点出发,从两个方向遍历链表
循环链表:在单向链表的基础上令表尾结点的指针指向第一个结点构成循环。特点是可以从表中任意结点遍历整个链表
静态链表:借助数组来描述线性表的链式存储结构。
2.栈和队列
栈和队列是程序中常用的两种数据结构,它们的逻辑结构和线性表相同。
特点在于运算有所限制:栈按后进先出的规则,队列按先进先出的规则。称为运算受限的线性表
2.1 栈
(1)栈只能通过访问它的一端来实现数据存储和检索的线性数据结构,栈的修改是按先进先出的原则。栈中进行插入删除的一端称为栈顶,另一端栈底,不含数据元素的栈为空栈
(2)栈的基本运算
初始化栈:创建一个空栈。
判栈空:当栈为空时返回真,否则假。
入栈:将元素插入栈顶,并更新栈顶指针。
出栈:将栈顶元素从栈中删除,并更新栈顶指针。若需要得到栈顶元素的值,可将出栈定义为一个返回栈顶元素值的函数。
读栈顶元素:返回栈顶元素的值,不修改栈顶指针。
(3)栈的存储结构
顺序存储:
栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时设指针top指示栈顶元素的位置。
用顺序存储结构的栈也称为顺序栈。这种存储方式栈的空间是有限的,需要预先定义栈的空间。顺序栈中当一个元素入栈时需要判断是否栈满,若栈满元素入栈会发生上溢现象
链式存储:
用链表存储栈元素可以克服顺序栈存在的溢出不足问题。用链表存储结构的栈也称为链栈,由于栈中元素的插入和删除仅在一端,因此不必另设头指针,链表的指针头就是栈顶指针
栈的应用:
栈的典型应用包括表达式求值、匹配、计算机语言的实现、递归过程转变为非递归过程的处理中栈发挥重要的作用
2.2 队列
队列是一种先进先出的线性表,只允许在表的一端插入元素另一端删除元素。插入元素的一端称队尾,允许删除的一端称队头
基本运算:
初始化队:创建一个空队列
判队空: 当队列为空时返回真,否则假。
入队:将元素加入到队列的队尾,并更新队尾指针
出队:将元素从队列中删除,并更新队头指针
读队头元素:返回队头元素值,但不更新队头指针
队列的存储结构:
(1)队列顺序存储
(2)队列链式存储
(2)队列应用
队列结构常用语需要排列的场合。如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等
2.3 串
二、数组、矩阵、广义表
1 数组
数组是定长线性表在维数上的扩展,即线性表的元素又是一个线性表。
数组特点
(1)数据元素数目固定,一但定义了一个数组结构,就不再有元素个数的增减变化
(2)数据元素具有相同的类型
(3)数据元素的下标关系具有上下界的约束且下标有序
数组的两个基本运算
(1)给定一组下标,存取相应的数据元素
(2)给定一组下标,修改相应的数据元素中某个数据项的值
几乎所有高级程序设计都提供数组类型。程序语言中把数组看成是具有共同名字的同一类型的多个变量的集合
数组顺序存储
数组一般不做插入和删除运算,定义数组后数据元素个数和元素之间的关系不再发生变动,所以数组适合采用顺序存储结构
计算机的内存结构再逻辑上是一维线性的,因此存储多维数组时必须按某种方式进行降维处理,即将数组元素排成一个线性序列
二维数组的存储结构可分为以行为主序和以列为主序的两种方法
2 矩阵
矩阵是科学与工程计算领域研究的数学对象,
3 广义表
三、树
树结构是一种非常重要的非线性结构,结构中一个元素可以有两个或两个以上的直接后继元素,树可以描述客观世界广泛存在的层次结构
四、图
五、查找
六、排序