第八章 抽象数据类型与子程序
8.1 抽象数据类型
抽象数据类型(ADT):属性(数据和操作)明确地与特定实现分离的容器[设计的目标是通过抽象减少复杂度]
- 应用(或用户)层是特定问题中的数据的视图。
2.逻辑(或抽象)层是数据值(域)和处理它们的操作的抽象视图。
3.实现层明确表示出了存放数据项的结构,并用程序设计语言对数据的操作进行编码。
数据结构:一种抽象数据类型中的复合数据域的实现。
容器:存放和操作其他对象的对象
8.2 栈
栈是一种抽象复合结构,只能从一端访问栈中的元素。可以在第一个位置插入元素,也可以删除第一个元素。
删除的项总是在栈中时间最短的项目。
插入操作没有任何约束,整个LIFO行为都体现在删除操作上。
插入操作:Push
删除操作:Pop
把项目推进栈,从栈中弹出项目。栈没有长度属性,所以没有返回栈中项目个数的操作。我们需要的是确定栈是否为空的操作,因为当栈空的时候再弹出项目会出错。
8.3 队列
队列也是一种抽象结构,队列中的项目从一端入,从另一端出。(FIFO)
插入操作在队尾进行,删除操作在队列的头部进行。
删除的总是在队列中时间最长的项目。
插入操作没有任何约束,整个FIFO行为都体现在删除操作上。
8.4 列表
列表的列是无止境的。
列表有三个属性特征:项目是同构的,项目是线性的,列表是变长的。
操作(Insert),删除(Delete),存在(IsThere),报告列表中项目数量(GetLength)
因为项目可以被删除和检索,所以列表中的项目必须能够相互比较。
不要把列表误认为是数组,数组是内嵌结构,列表是抽象结构。列表应用于数组中。
列表也可以被形象化为链式结构。
链式结构以节点的概念为基础,一个节点由两部分构成:用户的数据和指向列表的下一个节点的链接或指针。
列表的最后一个节点的指针变量存放的是表示列表结束的符号,null,用“/”表示
链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法。
无序列表,项目只是随意被放入其中;有序列表,项目之间具有语义关系。
除了第一个项目之外所有项目都存在某种排序关系。除了最后一个项目,所有项目都有着相同的关系。
8.5 树
8.5.1 二叉树
二叉树:具有唯一起始节点(根节点)的抽象复合结构,其中每个节点可以有两个子女节点,根节点和每个节点之间都有且只有一条路径。
根:树中唯一的开始节点。
叶节点:没有子女的树节点。
除了根节点之外,每个节点都只有一个父母节点。
8.5.2 二叉检索树
要在树上找一个项目,我们必须检查每一个节点,直到找到想要的那个,或者发现它并不在树上。
二叉检索树就像已排序的列表,节点间存在语义排序。
二叉检索树中的节点可以具有0个,1个,2个子女。
二叉检索树还具有语义属性来刻画树中节点上的值。(任何节点的值都要大于它的左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值)
-在二叉检索树中搜索
这种搜索法与线性结构的二分检索之间很相似,一次计较就排除很大一部分数据。
info(current):指的就是这个节点的用户数据。
left(current):指向的就是这个节点的左子树的根节点。
null说明指针指向空值
树的形状是由项目插入树的顺序决定的。
构造二叉检索树
输出二叉检索数中的数据
8.5.3 其他操作
8.6 图
图由一组节点和一组把节点相互连接起来的边构成的数据结构。
顶点:图中的节点
边(弧):表示图中两个节点的连接的顶点对。
图中的顶点表示对象,边则描述了顶点之间的关系。
无向图:其中的边没有方向的图。
有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。
加权图:表示边有附加值的图。
邻顶点:通过边连接起来的两个顶点。
路径:连接图中两个顶点的一系列顶点。
8.6.1 创建图
在图中定义的算法可以解决实际的问题。
单元格中的0表示不存在该路线。
-创建一个表格
1.在表格中添加一个顶点
2.在表格中添加一条边
3.在表格中添加一个权值
8.6.2 图算法
-深度优先搜索
当我们试图在两个顶点之间寻找路径时,用栈来储存访问的顶点。用深度优先搜索来检查第一个与起点相邻的顶点。如果它是终点,则搜索结束。否则,检查所有与第一个顶点相邻的顶点。
因为没找到终点则回溯,因此选栈用来存储顶点的合适的数据结构。
当你必须回溯时,选择离你无法走通位置的最近的分支继续搜索。
-广度优先搜索
回溯到尽可能远,选择队列来代替栈。
-单源最短路搜索
优先队列:检索与此顶点相连的边权值最小的顶点的抽象容器。
8.7 子程序
Insertz操作需要一个列表和一个插入其中的值。
Reset操作需要一个用来重置的列表。
MoreIttems操作需要一个列表来查看是否有更多元素等待被返回。
GetNext操作需要一个输入列表并返回列表的下一个元素。
8.7.1 参数传递
参数列表:程序中两部分之间的通信机制。
形参:列在子程序名后面括号中的标识符。
实参:子程序调用中列在括号中的标识符。
实参是调用单元中的真正变量。
位置形参:需要多次调用一个子程序,每次调用的实参又不相同。
8.7.2 值参与引用参数
值参:由调用单元传入实参的副本的形参。
引用参数:由调用单元传入实参的地址的形参。
###第九章 面向对象设计与高级程序设计语言
9.1 面向对象方法
9.1.1 面向对象
对象:在问题背景中相关的事物或实体。
类:一组具有相似属性和行为的对象的描述。
域:类中的特定项,可以是数据或子程序。
方法:定义了类的一种行为的特定算法。
9.1.2 设计方法
集体讨论(第一阶段),过滤,场景(确定每个类的行为),责任算法(为列出的类的责任编写算法)
9.1.3 一个计算机示例
9.2 翻译过程
汇编语言输入汇编器
9.2.1 编译器
编译器:把高级语言编写的程序翻译成机器码的程序。
9.2.2 解释器
解释器:输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序。
编译/解释
字节码:编译Java源代码使用的标准机器语言。
Java具有可移植性
Java编译器输出的程序将被解释而不是被执行。
Java程序总是被翻译成字节码而不是机器码。
9.3 程序设计语言的范型
两种主要范型:命令和声明
9.3.1 命令式范型
它具有顺序执行指令的特征,变量的使用代表了内存地址,而使用赋值语句则改变这些变量的值。
-面向过程的范型
一个程序是子程序分层次构成的,没=每一层执行整个问题求解的一个必要的特定任务。
-面向对象的范型
面向对象视角是与对象交互的一种方式,每个对象负责执行它自己的动作。
9.3.2 声明式范型
-函数式模型:基于函数的数学概念。
-逻辑编程:基于象征逻辑的原则
9.4 高级程序设计语言的功能性
选择和重复是命令式语言的标志
9.4.1 布尔表达式
布尔表达式:一个标识符序列,标识符之间由相容的运算符分割,求得的值是true或false。
9.4.2 数据归类
强类型化:每个变量都有一个类型,只有这种类型的值才能存储到该变量中。
数据类型:一组值以及能够应用于这种类型的值的基本操作集合的说明。
-数据类型
大多数高级语言都固有四种数据类型,即整数,实数,字符,布尔型。
--整数
整数的操作是标准的算数运算符和关系运算符。
模块运算符:返回整数除法的余数的运算符
--实数
实数数据类型表示特定精度的数的范围。
--字符
对字符进行算数运算是毫无意义的。
--布尔型
字符串是一种具有复合数据类型的特征的数据类型。
字符串:一个字符序列,在某些语言中这个序列通常被看作一个数据值。
单引号圈起字符,双引号圈起字符串。(高级语言不区分)
声明:把变量,动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目。
保留字:一种语言中具有特殊意义的字,不能用它作为标识符。
9.4.3 输入/输出结构
输出语句中列出的项目可以是文字值或变量名。
文字值是直接在输出语句中写的数字或字符串。
9.4.4 控制结构
控制结构:确定程序中的其他指令的执行顺序的指令。
嵌套逻辑
异步处理:不与计算机中的其他操作同时发生,与计算机的动作不同步。
9.5 面向对象语言的功能性
9.5.1 封装
封装:实施信息隐蔽的语言特性
对象类或类:属性和行为相似的一组对象的说明。
9.5.2 类
实例化:创建类的对象
9.5.3 继承
继承:类获取其他类的属性(数据域和方法)的机制。
9.5.4 多态
多态:一种语言的继承体系结构中具有两个同名方法且能够根据对象应用合适的方法的能力。
9.6 过程设计与面向对象设计的区别