目录
十二、抽象数据类型(ADT)
数据结构是计算机存储、组织数据的方式。数据结构包含三个要素:数据的逻辑结构、存储结构和操作。抽象数据类型是一种更抽象的概念,它包括了数据的定义和操作的定义,并不关心它们是如何实现的。网络上对于抽象数据类型与数据结构之间的关系有一些不同的说法,但我倾向于认为抽象数据类型是数据结构的抽象概念,本书的作者也认为抽象数据类型是由数据结构来实现的。
12.1 背景
使用计算机去解决一些问题意味着处理数据,那么我们就需要定义数据的类型以及对该类型数据的操作。例如,我们要让计算机进行两个整数的加法运算,首先就必须使计算机能够存储整数类型的数据,然后定义加法这个操作,我们才能用对应的指令去实现两个整数的加法。随着计算机技术的发展,如今我们处理的数据已经不再是简单的数字了,我们可能希望去处理一组有关联的数据,我们可能需要按照一定的逻辑去组织数据,这就有了抽象数据类型的概念。抽象数据类型包括数据的定义以及数据的操作,并且它只描述是怎样的操作,并不给出如何实现这些操作。
12.1.1 简单抽象数据类型
有些语言中已经定义的整型、字符型、浮点型等数据类型和它们的操作就是简单抽象数据类型。对于整型抽象数据类型来说,它指的是小数点固定的只有整数部分的数字,并且这个ADT定义了它的一些操作,例如加、减、乘、除等。对于我们来说,我们不需要关注加减乘除是如何实现的,只需要知道它们可以用于整型即可。
对于其他的字符型等类型与整型类似,它们也是抽象数据类型。
12.1.2 复杂抽象数据类型
简单抽象数据类型在大部分语言中已经被定义,但有时候我们需要处理类似学生的信息这样复杂的数据,所以需要定义复杂抽象数据类型。就像简单抽象数据类型一样,当我们建立好复杂抽象数据类型后,我们就可以使用它来更高效的处理数据,并且可以不用关注它的操作是如何实现的。显然,抽象数据类型提高了解决问题的效率。
ADT包含了一组允许程序员使用的操作的定义,而这些操作的实现是隐藏的。这种不需要详细说明实现过程的泛化操作称为抽象。
12.1.3 定义
抽象数据类型就是:
数据的定义;
操作的定义;
数据和操作的封装。
12.1.4 模型
抽象数据类型的模型如图所示,书中的私有操作可能是C++中的类成员中的private函数(这个函函数不能在类范围外被访问),这里就当作不存在。抽象数据类型包括数据的定义(数组、链表等)和操作的定义(C语言中可以是函数)。具体的应用程序通过调用对应的函数完成对数据的相应操作,而这一系列动作抽象出来的概念就是抽象数据类型。
12.1.5 实现
在介绍完每个抽象数据类型后,我会附上以前写的抽象数据类型的C语言实现文章,里面还有对一些具体应用的实现。
12.2 栈
栈是一种限制线性表,它的插入和删除只能从栈的一端进行。
栈抽象数据类型:
定义:一种只能在一端存取的数据表项,该端称为栈顶。
操作:建立一个空栈、push(入栈,在栈顶插入元素)、pop(出栈,删除栈顶元素)、empty(判断栈是否为空,判空操作许多数据结构都会用到,因为对空栈等数据结构进行的一些操作是不合法的)。
栈的应用:倒转数据、配对数据、数据延迟使用和回溯等。
栈的实现:
12.3 队列
队列是一种线性表,它限制插入只能从队尾,删除只能从队头,就像生活中的队列。
队列抽象数据类型:
定义:一种只能在队头删除并且只能在队尾插入的线性表。
操作:建立队列、enqueue(入队,在队尾插入一个元素)、dequeue(出队,删除队头元素)、empty(判断队列是否为空)。
队列的应用:操作系统等需要排队的地方。
队列实现:
队列的循环数组实现_循环数组实现队列_thdwx的博客-优快云博客
12.4 广义线性表
广义线性表是一种没有栈或队列这样对操作有限制的线性表。
广义线性表抽象数据类型:
定义:一个有序的数据项表,所有的数据具有相同的类型。。
操作:建表、insert(插入某个数据)、delete(删除某个数据)、检索某个位置的数据、查找某个数据、empty(判空)。
广义线性表的应用:存储大学生信息等。
广义线性表实现:
12.5 树
关于树的一些定义以及操作都在下方链接的文章里。
数据结构—二叉树_数据结构二叉树深度_thdwx的博客-优快云博客
12.6 图
关于图的定义与操作都在下方链接的文章里。
以下都是关于图的一些算法,有一点点难度。
图—拓扑排序_拓扑排序是唯一的吗_thdwx的博客-优快云博客
单源无权最短路径_无权图的单源最短路径算法_thdwx的博客-优快云博客
单源赋权最短路径_赋权图单源最短路径_thdwx的博客-优快云博客