计导 第 12 章 抽象数据类型

目录

抽象数据类型的模型

应用

实现

队列

应用

实现

广义的线性表

应用

实现

二叉树

二叉树的遍历

 二叉树应用

 二叉树的实现

二叉搜索树(BST)

图 


抽象数据类型(ADT)是一种比数据结构处于更高抽象层的数据类型,ADT使用数据结构来实现,同时隐藏数据上的操作是如何进行的。

抽象数据类型的模型

如上图所示,抽象数据类型封装数据和实现,只对外暴露一些接口,其自身的数据类型和操作的具体实现都是私有的。可以想想抽象数据类型像热水器一般,提供了进水、进气口和出水口等一些接口,我们只需要使用这些接口就行,至于里面的实现就完全抽象隐藏。

本章主要讨论栈、队列、树、图的一些基本操作和应用。

栈是一种后进先出(LIFO)的线性列表,其只能在 栈顶 添加和删除。如下图所示:

栈的基本操作有建栈(stack)、入栈(push)、出栈(pop)和检查是否为空栈(empty)。

应用

其LIFO的特性使得栈后4大类的应用:倒转数据、配对数据、数据延迟使用和回溯步骤。在此只列举前两种应用。

倒转数据:比如一次入栈1、2、3、4,那么再出栈所得就为4、3、2、1,反转了顺序。

配对数据:比如检查“{()[()]()[]}”这些括号是否完全配对,从左往右判断每一个符号是否与栈顶的元素配对,若配对则跳过这个符号同时将栈顶的那个元素出栈,反之就将此元素入栈,到最后栈为空则完全配对。

实现

栈可以使用数组和链表来实现,其都是带有两个域的记录来描述,如下。

数组实现: 两个域分别为一个计数项和一个记录栈顶元素所在数组中的索引(index)。

链表实现: 两个域分别为一个计数项和一个记录栈顶元素的指针

队列

是一种先进先出(FIFO)的线性列表,其在尾部添加和在首部删除,这样能够确保数据处理只能按照入队的顺序。如下图所示:

队列的基本操作有建队列(queue)、在尾部插入一个元素(enqueue)、在头部删除一个元素(dequeue)和检查是否为空队列(empty)。

应用

在所有的操作系统以及网络中都有队列的使用,按照顺序处理任务或指令,比如打印队列。

实现

队列可以使用数组和链表来实现,其都是带有三个域的记录来描述,如下。

数组实现: 三个域分别为一个计数项和两个记录首尾元素所在数组中的索引(index)。

链表实现: 三个域分别为一个计数项和两个记录首尾元素的指针

广义的线性表

栈和队列都线性表的特例,都只能在首部或是尾部操作元素。广义的线性表除了首尾操作外,也能在中间增删元素。

广义线性表有6中基本操作:建表(list)、插入(insert)、删除(delete)、检索(retrieve)、遍历(traverse)和检查是否为空(empty)。

应用

可应用于元素被随机存取或顺序存取的情况。

实现

队列可以使用数组和链表来实现,其都是带有两个域的记录来描述,如下。

数组实现: 两个域分别为一个计数项和一个记录首元素所在数组中的索引(index)。

链表实现: 两个域分别为一个计数项和一个记录首元素的指针

树包含一组优先的元素,称为节点。树的图示:

二叉树

二叉树是树的一种特例,其每一个节点最多有两个子节点,这连个子节点称为左、右节点。

二叉树的遍历

深度优先:根据根节点在遍历时的优先级又分为前序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)

 例:本例以前序遍历为例,使用两种思想来实现理解遍历。

广度优先:先遍历完第一层在遍历下一层的遍历方式。

 二叉树应用

赫夫曼编码:是一种压缩计数

表达式树:在表达式树中,根和节点是操作符,只有叶子是操作数。在我们日常的书写中习惯使用中缀表达式比如【a * (b + c) + d 】,但是编译器会将中缀表达式转换成后缀表达式【a b c + d * d +】。见下图的表达式树,前序遍历接得到前缀表达式,中序遍历得到中缀表达式,依次类推:

 二叉树的实现

可以使用数组或是链表实现,但是对于删除和插入操作,链表实现的效率要高,所有更为流行。

二叉搜索树(BST)

每个节点关键值大于左子树的所有节点,而小于右子树的所有节点。

 

 二叉搜索树有一个有趣的特征是:中序遍历能创建一个升序列表,所以也叫二叉排序树。

二叉搜索树的实现:可以用链表和数组,但通常都是使用链表实现,节点通常至少三个域,一个存储数据,另外两个存储指向两个子节点的指针

图 

图是一组节点相互连线的一种数据类型,相较于树来说,图的节点可以后对个父节点。图可能是有向图无向图两种。城市交通网,网络都是图型结构。


凡是过往,即为序章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值