数据抽象和抽象数据类型
954字约3分钟
数据结构和算法
2017-11-23
在开始谈数据结构之前,先聊一聊什么是数据抽象和抽象数据类型(ADT)。
数据抽象和抽象数据类型
数据抽象
数据类型是指 一组值 和 一组对这些值的操作 的集合,Java中有多种 原始数据类型,如int 。int 是 -2^31 到 2^31 - 1 (21.4亿)之间的这些整数值,以及加、减、乘、除等这些操作的集合。
理论上所有程序只需要使用这些原始数据类型(int double char等)即可,但如果我们能把原始数据类型抽象成更高级的数据类型(list string queue stack等),无疑会更加方便程序的编写。
例如我们有1个整数,我们可以很轻易地用 int 定义它,并且它可以跟另一个 int 相加。
int a = 5;
int b = 4;
int c = a+b;如果我们有100个整数,并想随时管理(操作)他们,例如继续添加或从中删除或修改某些数,那我们可以想象有一种数据类型,它可以管理一组数据,并且有 添加、删除、修改 等操作,这样我们就不用写 100 个零散的 int 了。恭喜你,你发明了 列表(List)这种数据类型。
List list;
// 现在,我们只要拿着这个 list 变量,就能做出很多很酷的操作,而不是手工修改 100 个零散的 int 类型
list.add(5);
list.remove(4);
list.modify(3,5);我们把定义和使用我们自己的数据类型的这个过程,叫做 数据抽象。
抽象数据类型(Abstract Data Type)
抽象数据类型(ADT) 是一种能够对使用者隐藏数据表示的数据类型。它将数据和函数的实现关联,并将数据的表示方式隐藏起来。我们在使用抽象数据类型时,主要关注如何操作而不关心数据本身是怎么表示的。也就是说,使用一个抽象数据类型,并不需要了解其实现细节。
抽象数据类型是一种理论上的类型,例如我们可以定义一个类型叫 列表(List),而在具体的编程语言如 Java 中, ArrayList 或 LinkedList 就是对 列表(List)的具体实现。

数据结构
现在我们可以对数据结构下一个定义:数据结构是一种在计算机中存储和组织数据的方式,这样,我们就可以更加方便地使用这些数据。
三种简单的集合类数据类型
背包(Bag)
背包是一种不支持从中删除元素的集合数据类型。它主要用于帮助用例收集元素,然后遍历这些的元素。这些元素没有顺序。
队列(List)
队列是一种先进先出(FIFO)策略的集合类型。
栈(Stack)
栈是一种后进先出(LIFO)策略的集合类型。栈的应用非常广泛,例如几乎每个编辑器都有的Undo(撤销)操作、操作系统中的程序调用栈、括号/符号匹配等等。
Java扩展:什么是对象的游离
在一个栈中,当我们使用pop()弹栈的时候,被弹出的元素我们再也不需要用到它了。但它的引用还存在于数组中。这种情况就称为游离。在 Java 中,避免对象游离很容易,只需将其设为 null 即可。这样系统(Java垃圾回收策略)就可以在使用完后将其回收。
- 参考书籍:《算法(第四版)》、《Hello 算法》
