第一章 简介
主要讲述伪码(pseudocode)、抽象数据类型(ADT)、算法效率(efficiency)
伪码(pseudocode):
一种类英语结构描述码。举例:
algorithm sample(ref pageNumber <integer>)
This algorithm reads a file and prints a report.
Pre pageNumber must be initialized
Post Report Printed. pageNumber contains number of pages in report.
Return Number of lines printed
1 open file
2 lines = 0
3 loop (not end of file)
1 read file
2 if (full page)
1 form read
2 pageNumber=pageNumber+1
3 write page heading
3 end if
4 write report line
5 lines=lines+1
4 end loop
5 close file
6 return lines
end sample
这就是伪码描述算法和数据结构的基本思路,其中Pre (precondition) 列出了所有参数需要的先决条件 即使是没有任何条件我们也应该列为:
Pre Nothing
其中的参数传递分为传值(passed by value)和传移用(passed by reference)分别用val 和ref表示,这里没有提到传递指针引用,因为C++里面不提倡运用指针。昨天在图书馆看《C++沉思录》,里面提到要成为一个好的C++程序员,有三条:
1,避免使用指针
2,提倡使用程序库
3,使用类来表示概念
避免使用指针是首当其冲的,另外要注意运用和学习程序库(STL),养成复用库代码的习惯,而不是凡事自己动手。因为太去注意语言的细节,编程风格往往是C类型的,而不是C++风格的。他们不会充分运用库,而自己的程序带有严重的C主义倾向-指针满天飞,整个程序都是低层次的。另外第三点就是要用抽象的观点看待生活中的对象,练习抽象的建立这种对象的能力。
呵呵,扯远了~,言归正传。
Post (postcondition)是用来描述所有发生的行为和所有输出参数的状态,如果有值(value)返回,还需要加一个return condition 来描述返回值。
另外在伪码中使用了缩进的数字格式,便于我们描述算法用。例如statement 3.1.2 将pageNumber每次循环加一等。
抽象数据类型:
数据类型(data type)包括两部分:数据和关于数据的操作(a set of data & the operations that can be performed on the data),这里不得不提一个概念,面向对象(OOP),其中一个很重要的概念就是封装(encapsulation) ,将数据和一些操作封装起来只提供一些对外的接口,用户可以不去关心内部的结构和实现,只需要懂怎么用就行了,当然背后有我们程序员的努力工作来实现。(程序员苦啊~~),不过通过C++的继承机制可以降低程序员的工作强度,提高开发效率。
数据结构简单的说就是将一些有确定关系的元数据类型的数据组合成一组数据(set),抽象数据类型(ADT)就是在数据结构的基础上封装一些操作。因此,
1,We Know what a data type can do. 我们知道一种数据类型可以做什么
2,How it is done is hidden. 但是它怎么做就不晓得了,对外是隐藏(hidden)的。
这里用户只需要通过external interface(外部接口)实现操作,而具体实现是通过internal call(内部调用)来实现的。
现在这些概念通过C++可以很容易的实现。还有一个概念,就是范型思想。C++通过模板机制给数据抽象带来很大的通用性。例如:
// Node Declaration
template <class TYPE>
struct NODE
{
...
}; // End of Node Declaration
//List Class Declaration
template <class TYPE,CLASS KTYPE>
class List
{
...
}; // End of Class List Declation
注:此处用到的模板和格式可以分别参照附录的K部分和C部分