计算机科学导论笔记(十)

目录

十二、抽象数据类型(ADT)

12.1 背景

12.1.1 简单抽象数据类型

12.1.2 复杂抽象数据类型

12.1.3 定义

12.1.4 模型

12.1.5 实现

12.2 栈

12.3 队列

12.4 广义线性表

12.5 树

12.6 图


十二、抽象数据类型(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(判断栈是否为空,判空操作许多数据结构都会用到,因为对空栈等数据结构进行的一些操作是不合法的)。

栈的应用:倒转数据、配对数据、数据延迟使用和回溯等。

栈的实现:

数据结构—栈_thdwx的博客-优快云博客

12.3 队列

队列是一种线性表,它限制插入只能从队尾,删除只能从队头,就像生活中的队列。

队列抽象数据类型:

定义:一种只能在队头删除并且只能在队尾插入的线性表。

操作:建立队列、enqueue(入队,在队尾插入一个元素)、dequeue(出队,删除队头元素)、empty(判断队列是否为空)。

队列的应用:操作系统等需要排队的地方。

队列实现:

队列的循环数组实现_循环数组实现队列_thdwx的博客-优快云博客

队列的链表实现_thdwx的博客-优快云博客

12.4 广义线性表

广义线性表是一种没有栈或队列这样对操作有限制的线性表。

广义线性表抽象数据类型:

定义:一个有序的数据项表,所有的数据具有相同的类型。。

操作:建表、insert(插入某个数据)、delete(删除某个数据)、检索某个位置的数据、查找某个数据、empty(判空)。

广义线性表的应用:存储大学生信息等。

广义线性表实现:

表ADT(抽象数据类型)_thdwx的博客-优快云博客

12.5 树

关于树的一些定义以及操作都在下方链接的文章里。

数据结构—树_thdwx的博客-优快云博客

数据结构—二叉树_数据结构二叉树深度_thdwx的博客-优快云博客

平衡二叉树 (AVL树)-优快云博客

12.6 图

关于图的定义与操作都在下方链接的文章里。

图的若干定义及表示-优快云博客

以下都是关于图的一些算法,有一点点难度。

图—拓扑排序_拓扑排序是唯一的吗_thdwx的博客-优快云博客

单源无权最短路径_无权图的单源最短路径算法_thdwx的博客-优快云博客

单源赋权最短路径_赋权图单源最短路径_thdwx的博客-优快云博客

最小生成树—Prim算法_最小生成树prim算法_thdwx的博客-优快云博客

图—双连通性_图的双连通性_thdwx的博客-优快云博客

深度优先搜索-优快云博客

欧拉路径(欧拉环游、欧拉回路)-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值