gongruitao 2019-10-30
容器:存放和其他操作其他对象的对象。
把栈比作自助餐厅的餐具架,使它插入和删除操作有了个惯用语,插入操作叫做Push(推进),删除操作叫做Pop(弹出)。栈没有长度属性,所有没有返回栈中项目个数的操作。
下面的算法读入数据后按照输入顺序进行输出。
WHILE(more data)
Read value
Enque(myQueue,value)
WHILE(NOT IsEmpty(myQueue))
Deque(myQueue,value)
Write value
补充:链式结构:一个将数据项和找到下一个位置的信息保存到同一容器的实现方法。
下面这段算法从文件中读取值,将值放到列表中,之后输出列表。
WHILE(more data)
Read value
Insert(myList,value)
Reset(myList)
Write"liteme in the list are"
WHILE(Moreltems(myList))
GetNext(myList,nextltem)
Write nextltem,"
-像列表,栈和队列这样的抽象结构本质上都是线性的,只模拟了一种数据关系。列表中的项目一个接着一个,栈和队列中的项目从时间来说也是一个挨着一个的。更复杂的关系需要更复杂的结构来表示
这种分层体系结构叫做树。在计算领域,我们所说的通常是二叉树,即每个节点最多有两个子节点的树。
叶节点:没有子女的树节点。
二叉检索树具有二叉树的形状属性,还具有语义属性来刻画树中节点上的值,即任何节点都有大于它的左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值。
如果current指向一个节点,那么info(current)指的就是这个节点中的用户数据,left指向的是current的左子树的根节点,right指向的是current的右子树的根节点。
IsThere(tree,item)
IF(tree is null)
RETURN TURE
ELSE
IF(Item equals info(tree))
RETURN TURE
ELSE
IF(Item<info(tree))
IsThere(left(tree),item)
ELSE
IsThere(right(tree),item)
IF(tree is null)
Put item in tree
ELSE
IF (item<info(tree))
Insert(left(tree),item)
ELSE
Insert(right(tree),item)
要输出根的值,必须先输出它的左子树中的所有值。右子树也如此。
IF(tree)
RETURN 0
ELSE
RETURN Length(left(tree))+Lenghth(right(tree))+1
有向图:其中的边是从一个顶点指向另一个顶点的图。
在表格中添加一个权值
从城市x到城市y最短的航程是什么?
这三个问题的答案包括了深度优先搜索,广度优先搜索和单源最短路搜索。
Set found to FALSE
Push(myStack,startVertex)
WHILE(NOT Isempty(myStack)AND NOT found)
Pop(myStack,tempVertex)
IF(tempVertex,equals endVertex)
Write endVertex
Set found to TRUE
ELSE IF (tempVertex not visuted)
Write tempVertex
Push all unvisited vertices adjacent with tempVertex
Mark tempVertex as visited
IF(found)
Write"Path has been printed"
ELSE
Write"Path does not exist"
Set found to FALSE
Enque(myQueue,startVertex)
WHILE(NOT IsEmpty(myQueue)AND NOT found)
Deque(myQueue,tempVertex)
IF(tempVertex equals endVertex)
Write endVertex
Set found to TRUE
ELSE IF (tempVertex not visited)
Write tempVertex
Enque all unvisited vertices with tempVertex
Mark tempVertex as visited
IF(found)
Write"Path has been printed"
ELSE
Write"path does not exist"
最小行程次数的航线并不意味着是最短的总距离。
如果一个子程序需要传递信息,调用单元将会把值发送给子程序来使用。
Setx to m*sin(t)
Set to abs(z)
假设已经检验过这些算法中的抽象数据类型的容量:
WHILE(more data)
Read value
Insert(myList,value)
Reset(myList)
Write"Itens in the list are"
WHILE(Moreltems(myList))
GetNext(myList,nextltem)
Write nextltem,""
实参:子程序调用中列在括号中的标识符。
//Subprogram definition
Set list.values(list.length-1) to definition
Set list.length to list.length+1
Insert(myList,value) //Calling statement
引用参数:由调用单元传入实参的地址的形参。
Set temp to item2
Set item2 to item1
Set item1 to temp
getlength(list)
RETURN list.length
IsThere(list,item)
Set position to 0
WHILE(position<list.length AND list,values(position)!=item)
Set position to position+1
RETURN position<list.length
IsThere是一个有返回值的子程序,该例子为布尔类型的返回值。
方法:定义了类的一种行为的特定算法。
总结:自顶向下的设计方法重点在于把输入转化成输出的过程,结果将生成任务的体系结构。面向对象设计的重点是要转换的数据对象,结果生成的对象是对象的体系结构。
-P290——P292
任何计算机只要具有一种高级语言的编译器,就能运行用这种语言编写的程序。想要在多种类型的机器上使用一种高级语言,就要具备这种语言的多个编译器。
字节码:编译Java源代码使用的标准机器语言
什么是范形?《美国传统词典》对范形的定义有两条与计算相关,即“用作模式或模型的实体”和“一组假设,概念,值和实践,构成了共享它们的聚合体观察现实的方式,尤其适用于精神学科。”
面向对象的范型
面向对象视角是与对象交互的一种方式。每个对象负责执行它自己的动作。在面对过程的范型中,数据被认为是被动并且被程序所操控的。在面向对象的范型中,数据对象是活跃的。对象和操作对象的代码绑定在一起,使得每个对象负责控制自己的操作。Java和Python是两种新式的面向对象编程语言。
C++和Java是命令式语言,但就它们的范型而已又是混合的。
声明式范型是一个描述结果的模型,但是完成结果的过程则不被描述。在这种范型中有两种基本模型:函数式和逻辑式。
基于函数的属性概念。计算通过对函数求值来实现,而问题求解通过函数调用来实现。因此基本的原理是函数的求值,而不是变量和赋值语句。
逻辑编程基于象征逻辑的原则。这个模型包括了一系列关于对象的事实和一系列关于对象间关系的规则。
PROLOG是1970年早法国研发的第三代逻辑编程语言。一个PROLOG程序包含三中语句:一种声明了对象及对象之间关系的事实,一种定义了对象及对象之间的关系规则,第三种询问对象及对象之间关系的问题。
如,定义关于宠物和主人的事实
owns(mary.bo).
owns(ann.kitty).
owns(bob.riley).
owns(susy.charlia).
当你有一个由事实构成的数据库时,PROLOG允许你向数据库询问问题。如:
?-owns(mary.bo)
?-owns(bo.mary)
?-owns(susy.bo)
PROLOG对第一个回答yes,第二个回答no,第三个回答no。
在PROLOG系统中,常量以小写字母开头,变量以大写字母开头。事实上,我们以一个常量代替一个变量来询问事实真相。
?-owns(ann.Cat).
?-owns(Name.charlie).
两种伪代码结构——选择和重复是命令式语言的标志。
首先,我们回顾布尔表达式的概念,它是高级语言用于进行选择的结构。
一个布尔表达式加一个布尔运算符,再加一个布尔表达式
关系运算符是比较两个值的运算符。下表总结了六种关系运算符以及各种高级语言用于表示它们的符号。
符号 | 含义 | 示例 | 计算法则 |
---|---|---|---|
< | 小于 | Number1<Number2 | 如果Number1小于Number2,为吐热,否则为false |
<= | 小于等于 | Number1<=Number2 | 如果Number1小于等于Number2,为true,否则为false |
> | 大于 | Number1>Number2 | 如果Number1大于Number2,为true,否则为false |
>= | 大于等于 | Number1>=Number2 | 如果Number1大于等于Number2,为true,否则,为false |
!=或<>或/= | 不等于 | Number1!=Number2 | 如果Number1不等于Number2,为true,否则为false |
=或== | 等于 | Number1=Number2 | 如果Number1等于Number2,为true,否则为false |
强类型化:每个变量都有一个类型,只有这种类型的值才能存储到该变量中。
数据类型:一组值以及能够应用于这种类型的值的基本操作集合的说明。
区分大小写
大写字母和小写字母被看作是不同的,两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符。
P199
异步处理
异步:不与计算机中的其他操作同事发生,换句话说,与计算机的动作不同步。
类(实现阶段):对象的模式
P205-P206
实例化:创建类的对象
类获取其他类的属性(数据域和方法)的机制。
一种语言的继承体系结构中具有两个同名方法且能够根据对象应用合适的方法的能力。
在面向对象的设计中,列表数据结构和子程序需要在类中绑定在一起
public class List
//Class variables
values[]
lengteh
//Class methods
public Boolean Is There(item)
Set position to 0
WHILE(position < length AND values [position]!=item)
Set position to position+1
RETURN position<length
public Delete(item)
Set position to 1
WHILE(values[position]!=item)
Set position to position + 1
Set length to length - 1
//Rest of class operations
List list = new List()
WHILE(more values)
Read aValue
IF(NOT list.IsThere(aValue)
list.insert(aValue)
Write"input value to delete or "Quit" to quit "
IF(list.IsThere(aValue))
list.Delete(aValue)