数据结构与算法基础——第01周-基本概述与术语2(1.2)

一 概述

  • 数据类型
  • 抽象数据类型

二 数据类型

2.1 明确数据类型

在使用高级程序设计语言编写程序时,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。

例如:C语言中:

  • 提供int,char,float,double等基本数据类型
  • 数组、结构、共用体、枚举等构造数据类型
  • 还有指针、空(void)类型
  • 用户也用typedef自己定义数据类型

2.2 基本数据结构

一些最基本的数据结构可以用数据类型类实现,如数组、字符串等

2.3 不能用基本数据结构实现

而另一些常用的数据结构,如栈、队列、树、图等,不能直接用数据类型来表示

2.4 高级语言数据类型

高级语言中的数据类型明显地或隐含地规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许进行的操作。

例如:C语言中定义变量i为int类型,就表示i是[-min,max]范围的整数,在这个整数集上可以进行+、-、*、\,%等操作

数据类型的作用

  • 约束变量或常量的取值范围
  • 约束变量或常量的操作

2.5 数据类型(Data Type)

定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称

数据类型=值的集合+值集合上的一组操作

三 抽象数据类型

3.1 概念——抽象数据类型(Abstract Data Type,ADT)

是指一个数学模型以及在此数学模型上的一组操作。

  • 由用户定义,从问题抽象出数据模型(逻辑结构)
  • 还包括定义在数据模型上的一组抽象运算(相关操作)
  • 不考虑计算机内的具体存储结构与运算的具体实现算法

3.2 抽象数据类型的形式定义

抽象数据类型可用(D,S,P)三元组表示。

其中:

  • D是数据对象
  • S是D上的关系集
  • P是对D的基本操作集

3.3 一个抽象数据类型的定义格式如下:

1
2
3
4
5
6
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>

}ADT 抽象数据类型名

其中:

  • 数据对象、数据关系的定义用伪代码描述
  • 基本操作的定义格式为:
    • 基本操作名(参数表)
    • 初始条件:初始条件描述
    • 操作结果:操作结果描述

基本操作定义格式说明:

  • 参数表:赋值参数,只为操作提供输入值,引用参数以&打头,除可提供输入值外,还将返回操作结果
  • 初始条件:描述操作执行之前数据结构和参数应满足的条件。如不满足,则操作失败,并返回相应出错信息。若初始条件为空,则省略之。
  • 操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果

3.4 抽象数据类型ADT定义举例——Circle的定义

ADT格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ADT 抽象数据类型名{
Data
数据对象的定义
数据元素之间的逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
...
操作n
....

}ADT 抽象数据类型名

Circle伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
ADT Circle{
数据对象:D={r,x,y|r,x,y均为实数}
数据关系:R={<r,x,y>,r是半径,<x,y>是圆心坐标}
基本操作:
Circle(&C,r,x,y)
操作结果:构造一个圆
double Area(C)
初始条件:圆已存在。
操作结果:计算面积
double Circumference(C)
初始条件:圆已存在

}

3.5 抽象数据类型ADT定义举例——复数的定义

问题描述:在高级语言中,没有复数类型,但是可以借助已有的数据类型解决复数类型的问题

ADT格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ADT 抽象数据类型名{
Data
数据对象的定义
数据元素之间的逻辑关系的定义
Operation
操作1
初始条件
操作结果描述
操作2
...
操作n
....

}ADT 抽象数据类型名

复数伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ADT Complex{
D={r1,r2|r1,r2都是实数}
S={<r1,r2>|r1是实部,r2是虚部}
assign(&C,v1,v2)
初始条件:空的复数C已存在
操作结果:构造复数C,r1,r2分别被赋以参数v1,v2的值
destory(&C)
初始条件:复数C已存在
操作结果:复数C已被销毁
Assign(&z,v1,v2)
操作结果:构造复数z,其实部和虚部,分别被赋以参数v1,v2值
Destory(&z)
操作结果:复数z被销毁
GetReal(z,&realPart)
初始条件:复数已存在。
操作结果:用realPart返回复数z的实部值
GetImag(z,&ImagPart)
初始条件:复数已存在。
操作结果:用ImagPart返回复数z的虚部值
Add(z1,z2,&sum)
初始条件:z1,z2是复数。
操作结果:sum返回两个复数z1,z2的和
}ADT Complex