本系列博客主要讨论数据结构的一些基本知识,我们先从表、栈和队列入手,进而讨论树结构,以及各种结构在算法中的应用。
- 介绍抽象数据类型(ADT)的概念;
- 介绍表ADT和它的一些有效操作;
- 介绍栈ADT及其实现递归方面的应用;
- 介绍队列ADT及其在操作系统和算法设计中的应用;
抽象数据类型
在程序设计中,主例程不应超过一页,我们把程序的一些主要逻辑可以切割成不同的模块来实现(module)。每个模块实现程序的某个特定功能。这样我们在程序设计中有以下优点:
- 调试方便,调试小程序比调试大程序方便;
- 方便多人协作开发,模块之间互相独立;
- 程序修改起来方便;
抽象数据类型(abstructc data type, ADT)是一些操作的集合。在 ADT 的定义中根本没有涉及如何实现操作的集合,因此抽象数据类型也可以看作是一种模块化设计方式。例如对于一个集合 ADT,我们可以有并、交和获取大小等操作,或者,我们只需要并和查找两个操作。这就是两个不同的集合ADT。
对于每种 ADT,并没有某个确定的理论来告诉我们需要哪些操作,这一般取决于程序设计者的决策,对于操作的实现我们一般也是通过模块化进行实现。我们先讨论表、栈和队列这三种数据结构,这三个数据结构是最基本的ADT。
表 ADT
表 ADT 一般要实现的操作集合包括:获取表的大小、清空表、查找元素的位置、插入元素和杀出元素等;表的实现有简单的数组实现和链表结构,但是由于数组结构的限制,比如插入和删除都需要移动数组中的所有元素,因此一般我们并不推荐用数组来实现表 ADT。
为了提升表 ADT 的运行速度,特别是删除和插入的运行开销,我们必须允许表结构在内存中不连续存储,所以我们的每一个结构包含一个只想后续元素的结构指针,记作 NEXT 指针,最后一个指针指向 NULL。链表结构又包括:单项链表、双链表、循环链表等,我将在下一遍博客中介绍链表的 C 语言实现和它的应用,未完待续.......