抽象数据类型
抽象数据类型 (ADT) 是对象的类型(或类),其行为由一组值和一组操作定义。
ADT 的定义只提到了要执行哪些操作,而没有提到这些操作将如何实现。它没有指定如何在内存中组织数据以及将使用哪些算法来实现这些操作。它被称为“抽象”,因为它提供了一个独立于实现的视图。仅提供基本要素并隐藏细节的过程称为抽象。
数据类型的用户不需要知道该数据类型是如何实现的,例如,我们一直在使用诸如 int、float、char 数据类型之类的原始值,只知道这些数据类型可以在没有任何了解它们是如何实施的。所以用户只需要知道数据类型可以做什么,而不需要知道它是如何实现的。将 ADT 视为隐藏数据类型的内部结构和设计的黑匣子。现在我们将定义三个 ADT,即 List ADT、Stack ADT、Queue ADT。
- 列出 ADT
- 数据通常以键顺序存储在列表中,该列表具有由计数、指针和比较列表中数据所需的比较函数地址组成的头部结构。
- 数据节点包含指向数据结构的指针和指向列表中下一个节点的自引用指针。
//List ADT Type Definitions typedef struct node { void *DataPtr; struct node *link; } Node; typedef struct { int count; Node *pos; Node *head; Node *rear; int (*compare) (void *argument1, void *argument2) } LIST;
- 列表 ADT 函数如下所示:
列表包含按顺序排列的相同类型的元素,并且可以在列表上执行以下操作。
- get() – 从列表中的任何给定位置返回一个元素。
- insert() – 在列表的任意位置插入一个元素。
- remove() – 从非空列表中删除第一次出现的任何元素。
- removeAt() – 从非空列表中删除指定位置的元素。
- replace() – 用另一个元素替换任意位置的元素。
- size() – 返回列表中元素的数量。
- isEmpty() – 如果列表为空,则返回 true,否则返回 false。
- isFull() - 如果列表已满,则返回 true,否则返回 false。
- 堆栈 ADT
- 在堆栈 ADT 实现中,不是将数据存储在每个节点中,而是存储指向数据的指针。
- 程序为数据分配内存,并将地址传递到堆栈 ADT。
- 头节点和数据节点封装在 ADT 中。调用函数只能看到指向堆栈的指针。
- 堆栈头结构还包含一个指向顶部的指针和当前堆栈中的条目数。
//Stack ADT Type Definitions typedef struct node { void *DataPtr; struct node *link; } StackNode; typedef struct { int count; StackNode *top; } STACK;
Stack 包含按顺序排列的相同类型的元素。所有操作都在堆栈顶部的单个端进行,并且可以执行以下操作:
- push() – 在栈顶插入一个元素。
- pop() – 移除并返回栈顶的元素,如果它不为空。
- peek() - 如果堆栈不为空,则返回堆栈顶部的元素而不删除它。
- size() – 返回栈中元素的数量。
- isEmpty() - 如果堆栈为空,则返回 true,否则返回 false。
- isFull() - 如果堆栈已满,则返回 true,否则返回 false。
- 队列 ADT
- 队列抽象数据类型 (ADT) 遵循堆栈抽象数据类型的基本设计。
- 每个节点都包含一个指向数据的空指针和指向队列中下一个元素的链接指针。程序的职责是分配内存来存储数据。
//Queue ADT Type Definitions typedef struct node { void *DataPtr; struct node *next; } QueueNode; typedef struct { QueueNode *front; QueueNode *rear; int count; } QUEUE;
队列包含按顺序排列的相同类型的元素。操作在两端进行,插入在末尾完成,删除在前面完成。可执行以下操作:
- enqueue() – 在队列末尾插入一个元素。
- dequeue() – 如果队列不为空,则移除并返回队列的第一个元素。
- peek() – 如果队列不为空,则返回队列元素而不删除它。
- size() – 返回队列中元素的数量。
- isEmpty() – 如果队列为空,则返回 true,否则返回 false。
- isFull() – 如果队列已满,则返回 true,否则返回 false。
从这些定义中,我们可以清楚地看到,这些定义并没有具体说明这些 ADT 将如何表示以及如何进行操作。可以有不同的方式来实现 ADT,例如,List ADT 可以使用数组、单链表或双链表来实现。类似地,栈 ADT 和队列 ADT 可以使用数组或链表来实现。
参考: https://en.wikipedia.org/wiki/Abstract_data_type