**抽象資料型別**（英語：，縮寫：**ADT**）是计算机科学中具有类似行为的特定类别的数据结构的数学模型；或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的，通过其上的可执行的操作以及这些操作的效果的数学约束（与可能的代价）。

例如，抽象的堆疊（stack）由3个操作定义：推入push，彈出pop（接受约束：每次彈出返回的是最新被推入且没有被弹出的数据，也就是後進先出），查看堆疊頂端数据peek。当分析使用堆疊演算法的效率，所有这3个操作用时相同，无论堆疊中包含多少项数据；并且对每项数据栈使用了常量大小的存储。

抽象数据类型（ADT）是纯粹理论实体，用于简化描述抽象算法，分类与评价数据结构，形式描述程序设计语言的类型系统。一个ADT可以用特定数据类型或数据结构实现，在许多程序设计语言中有许多种实现方式；或者用形式规范语言描述。ADT常实现为模块（module）：模块的接口声明了对应于ADT操作的例程（procedure），有时用注释描述了约束。

範例
--

在程式語言（或函式庫）和教科書中，常見的幾個抽象資料型別如下：

* 关联数组
* 複數
* 容器
* 雙端佇列
* 列表
* Multimap
* 優先佇列
* 佇列
* 集合
* 堆疊
* 字串
* 樹

介面和實作的分離
--------

實現於程式時，抽象資料型別只顯現出其介面，並將實作加以隱藏。使用者只需關心它的介面，而不是如何實作。未來更可以改變實作的方式。（其支援資訊隱藏原理，或保護程式免受變化的衝擊。）

抽象資料型別的強處在於對使用者隱藏了實作細節，僅公開其介面。這表示抽象資料型別可以用各種方法來實作，只要遵循其介面，就不會影響到使用者。

在抽象資料型別和資料結構之間，有一個實作上的微妙差別。例如，列表的抽象資料型別可以陣列為基礎、或者使用鏈表來實作。列表即是一種具良好運算（加入元素、移除元素等等）定義的抽象資料型別。鏈表是以指標為基礎的資料結構，且可用來建立一個列表。鏈表常用於列表的抽象資料型別。

同樣地，二元樹搜尋法的抽象資料結構可以幾個方式實作：二元樹、AVL樹、紅黑樹、陣列等等。且無須關心其實作，二元樹搜尋法總是有相同的運算（插入、移除、尋找等等）。

從實作中分離出介面，並不表示使用者不該知道實作的方法，而是使用者不能依賴於實作細節。例如，一個抽象資料型別可以用腳本語言建立，或其它可以被反編譯的語言（如 C語言）。即使使用者可發現實作的方法，只要所有客戶端程式遵循該介面，且改變實作方式時不會產生影響，那就仍是抽象資料型別。

在物件導向的用語中，抽象資料型別相當於類別；抽象資料型別的實體就相當於物件。某些語言包含了用於宣告抽象資料型別的建構子。例如，C++ 和 Java 為此提供了類別建構子。

抽象資料結構
------

**抽象資料結構**即根據所要運算的資料以及其計算複雜性所定義的抽象儲存區，而不關心具體的資料結構的實作。

就實作高效率的演算法而言，對資料結構的選擇相當重要。抽象資料結構的選擇，決定了高效率的演算法的設計，和估計其計算複雜性。

這個概念與程式語言理論中所使用的抽象資料**型別**非常接近，大致上抽象資料結構和抽象資料型別的名稱，和具體的資料結構的名稱一致。

內建抽象資料型別
--------

一部分抽象資料型別在程式設計中相當普遍且實用，所以在某些程式語言中，成為原生型別、或加進標準函式庫中。例如，Perl 的陣列可以用列表或雙端佇列之類的抽象資料型別來實作，雜湊表也可以用 Map 或 Table 來做。C++ 標準函式庫和 Java 函式庫也提供了列表、堆疊、佇列、Map、優先權佇列和字串。

實際範例
----

### 作為抽象資料型別的有理數

有理數（可以 a/b 格式表示的數，且 a 和 b 都是整數）本來是不能在電腦中表示出來。不過可以合理的抽象資料型別來定義，如下。

構造：使用兩個整數 a 與 b 建立實體，其中 a 為分子，b 為分母。

運算：加法、減法、乘法、除法、乘幕、比較、約分，轉成實數（浮點數）。

要完成整個規格，就要根據資料來定義所有的運算。例如，當兩個有理數 a/b 和 c/d 相乘時，相乘的結果就要定義為 ( a c ) / ( b d )。還有輸入、輸出、先決條件、後置條件，以及對抽象資料型別的各種假定。

### 堆疊

#### 介面

堆疊的抽象資料型別介面，以 C 語法編寫：

```
long stack_create(); /* 建立新的堆疊實體 */
void stack_push(long stack, void *item); /* 將一個項目堆入堆疊 */
void *stack_pop(long stack); /* 從堆疊頂部取得項目 */
void stack_delete(long stack); /* 刪除堆疊 */
```

#### 用法

抽象資料型別可以如下方式使用：

```
long stack;
struct foo *f;

stack = stack_create(); /* 建立堆疊 */

stack_push(stack, f); /* 將 foo 結構加入堆疊 */

f = stack_pop(stack); /* 從堆疊取得頂部的結構 */
```

#### 各種實作

上述堆疊的抽象資料型別，一開始可以使用陣列來實作，然後改用鏈表，而不會傷到任何使用者的代碼。有多少方法可以實作抽象資料型別，取決於程式語言。例如，上述範例可使用 C 編寫一個結構，以及隨同的一組資料結構，可使用陣列或鏈表來存放記錄；當建構子函式返回一個抽象句柄時，就對使用者隱藏了真實的實作過程。

參閱
--

* 抽象化

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据类型 |
| --- |
|  |
| 无解释的 | 
* 位元
* 字节
* 三进制位
* 三进制字节
* 字

 |
|  |
| 数值 | 
* 整数
	+ 符号性
	+ 有符号数
	+ 无符号数
* 定点数
* 浮点数
	+ 双精度
	+ 扩展精度（英语：）
	+ 半精度
	+ 迷你浮点数（英语：）
	+ 八倍精度（英语：）
	+ 四倍精度（英语：）
	+ 单精度
* 有理数（英语：）
* 复数（英语：）
* 任意精度算术
* 区间（英语：）

 |
|  |
| 文本 | 
* 字符
* 字符串

 |
|  |
| 指针 | 
* 記憶體位址
	+ 物理地址
	+ 虚拟地址
* 參照

 |
|  |
| 组合 | 
* 代数数据类型
	+ 广义（英语：）
* 数组
* 关联数组
* 类
* 串列
* 对象
	+ 元对象
* 可选类型
* 积类型（英语：）
* 记录
* 集合
* 联合体
	+ 标签

 |
|  |
| 其他 | 
* 布尔型
* 底层类别（英语：）
* 容器
* 枚举类型
* 异常
* 头等函数
* 不透明数据类型（英语：）
* 递归数据类型
* 信号标
* 字串流
* 顶类型（英语：）
* 类型类
* 類型系統
* 单位类型（英语：）
* Void
* 不定型別

 |
|  |
| 相关议题 | 
* 抽象資料型別
* 数据结构
* 介面
* 种类（英语：）
* 元类
* 对象类型（英语：）
* 原始型別与複合型別
* 协议
* 子类型
* C++模板
* 型別構造器
* 参数多态

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
数据结构 |
| --- |
|  |
| 类型 | 
* 集合
* 容器

 |
|  |
| 抽象类型 | 
* 关联数组
	+ 多重关连数组（英语：）
* 串列
	+ 前向串列
* 堆栈
* 队列
	+ 双端队列
* 优先队列
	+ 双端优先队列
* 集合
	+ 多重集
	+ 併查集
* 可持久化数据结构
	+ 线段树

 |
|  |
| 数组 | 
* 字串
* 位数组
* 环形缓冲器
* 动态数组
* 哈希表
* 哈希数组树（英语：）
* 稀疏矩阵

 |
|  |
| 链（英语：） | 
* 关联表（英语：）
* 链表
* 跳跃列表
* 松散链表（英语：）
* 异或链表

 |
|  |
| 树 | 
* 线段树
* 自平衡二叉查找树
* B树
* 二叉树
	+ AA树
	+ AVL树
	+ 红黑树
	+ 平衡树
	+ 伸展树
	+ 二叉查找树
* 堆
	+ 二叉堆
	+ 左偏树
	+ 二项堆
	+ 斐波那契堆
* R树
	+ R\*树
	+ R+树
	+ 希爾伯特R树（英语：）
* 希尔伯特前缀树
	+ 哈希树

 |
|  |
| 图 | 
* 有向图
* 有向无环图
* 二元决策图
* 无向图
* 确定性非循环有限自动机（英语：）

 |
|  |
| 数据结构术语 |

 |


|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
编程范型 |
| --- |
|  |
| 指令式 | 
* 过程式
* 非结构化
* 结构化
	+ 杰克逊结构化
* 例外处理

 |
|  |
| 函数式 | 
* 纯函数式
* 全函数式
* 隐式
	+ 函数级
* 代数数据类型
* 递归数据类型
* 模式匹配
* 推导式
* 面向表达式（英语：）

 |
|  |
| 面向对象 | 
* 基于类
* 基于原型
* 抽象数据类型
* 契约式
* 面向代理

 |
|  |
| 元编程 | 
* 
* 模板
* 反射式
	+ 同像性
	+ 元对象
	+ 元类
* 面向特性
* 面向语言

 |
|  |
| 数据流程 | 
* 同步式
* 响应式
	+ 函数式响应
* 管道
* 串流处理
* 基于流程

 |
|  |
| 宣告式 | 
* 逻辑式
	+ 回答集
	+ 函数式逻辑
* 约束式
* 数据查询
* 框架本体

 |
|  |
| / | 
* 协程
	+ 生成器
* future/promise
* 演员模型
	+ 消息传递
* 通信顺序进程
	+ 通道
* 分叉会合
* 整体同步

 |
|  |
| 其他范型 | 
* 模块化
	+ 关注分离
* 面向方面
* 数据驱动
* 事件驱动
* 串接式
	+ 面向堆栈
* 基于自动机
* 可微分
* 概率式

 |
|  |
|  基本特征 | 
* 块
	+ 嵌套函数（英语：）
	+ 回调函数
* 阵列
* 递归
* 多态
	+ 运算符重载
	+ 泛型
	+ 多分派
* 求值策略
* 非确定性
* 头等对象
	+ 头等函数
	+ 闭包
	+ 依赖类型
* 实化
	+ 续体

 |
|  |
| 多范型语言比较（英语：） |

 |

|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| 规范控制 編輯維基數據鏈接 | 
* GND: 4120827-4
* J9U: 987007292961405171
* LCCN: sh85000253
* LNB: 000296702
* NKC: ph543013

 |

 |