抽象数据类型(ADT)


上次更新时间:4/6/2021, 6:10:35 PM 0

抽象数据类型(Abstract Data Type,ADT),是指一个数学模型及定义在该模型上的一组操作。它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合。

抽象数据类型的主要作用是数据封装和信息隐藏,让实现与使用相分离。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响,这就是信息隐藏。

# 为什么需要抽象数据类型?

其实就是先设计后开发(类似于 UML类图)。根据数据结构的特性,抽象出这个结构的一些操作方法,设计完了没问题之后再开发实现。其他人只需要根据定义的参数调用就行,不用管怎么实现的。(有点类似接口文档)只要把这几个字拆分开,就容易理解了:

  • 抽象:抽取出事物具有的普遍性的本质
  • 数据类型:一组性质相同的值的集合以及定义在此集合上的一次操作的总称

抽象数据类型不是固定不变的,但是会有约定的一些操作,例如,那肯定有出栈和入栈的操作。

# 栈的抽象数据类型

  • ADT 栈(Stack)
    • Data
      • 数据对象集合为{a1, a2, a3, ..., an},每个元素类型均为DataType。其中,除第一个元素 a1 外,每一个元素有且只有一个直接前驱元素,除了最后一个元素 an 外,每一个元素由且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
    • Operation
      • InitStack(*S): 初始化操作,建立一个空栈 S。
      • DestroyStack(*S): 若栈存在,则销毁它。
      • ClearStack(*S): 清空栈。
      • GetTop(S, *e): 若栈存在且非空,用 e 返回 S 的栈顶元素。
      • push(*S, e): 若栈 S 存在,插入新元素 e 到栈 S 中并成为栈底元素。
      • Pop(*S, *e): 删除栈 S 中栈顶元素,并用 e 返回其值。
      • getLength(S): 返回栈 S 的元素个数。
  • endADT

根据上面的 ADT,我们就可以开始进入实现步骤。就是实现一个 Stack 类,这个类里面具有以上特点和操作方法。这样是不是容易理解多啦。

function Stack() { 
    this.dataStore = [];  // 初始化一个空数组来保存 
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.peek = peek;
    this.clear = clear;
    this.length = length; 
}
function push(element) { 
    this.dataStore[this.top++] = element; 
}
function peek() { 
    return this.dataStore[this.top-1];
}
function pop() { 
    return this.dataStore[--this.top]; 
}
function clear() {
    this.top = 0; 
}
function length() { 
    return this.top; 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上次更新时间: 4/6/2021, 6:10:35 PM