程序像河水一样流动着
作为计算机大脑的 CPU 在同一时刻基本上只能够解释、执行一条指令。
把指令和作为指令操作对象的数据排列起来就形成了程序。
程序的流程分为三种
顺序执行、条件分支、循环

- 顺序执行只需用直线将矩形框连接起来 (a)。
- 条件分支用菱形表示 (b)。
- 循环的表示方法是通过条件分支回到前面的处理步骤 (c)。

- 循环是通过当满足条件时就返回到之前处理过的步骤来实现的。
- 在这些高级语言中,程序员使用“程序块”表示循环而不是跳转指令。
- 条件分支也是由程序块表示的。在 VBScript 中,使用 If、ElseIf、Else、End If 表示条件分支的程序块。
结构化程序设计
为了把程序编写得具备结构性,仅使用顺序执行、条件分支和循环表示程序的流程即可,而不再使用跳转指令
如:在 VBScript 等高级语言中,可以用 If~ElseIf~Else~End If 程序块表示条件分支,用 For~Next 程序块表示循环。
画流程图来思考算法
所谓算法(Algorithm),就是解决既定问题的步骤。想让计算机解决问题,就需要把问题的解法转换成程序的流程
思考算法时的要点是要分两步走,先从整体上考虑程序的粗略流程,再考虑程序各个部分细节的流程。
与算法成为好朋友的七个要点
即“输入数值”“执行加法运算”“展示结果”,被称为算法
要点 1:算法中解决问题的步骤是明确且有限的
要点 2:计算机不靠直觉而是机械地解决问题
要点 3:了解并应用典型算法

要点 4:利用计算机的处理速度
要点 5:使用编程技巧提升程序执行速度
要点 6:找出数字间的规律
要点 7:先在纸上考虑算法
1 | 画流程图就可以方便地把算法用图表示出来,因此请诸位大量地、灵活地运用它。 |
与数据结构成为好朋友的七个要点
如何结合计算机的特性,用程序来表示现实世界中的数据结构。
- 要点 1:了解内存和变量的关系
变量是程序中数据存储的最小单位,每个变量都对应着一块物理上的内存空间。

- 要点 2:了解作为数据结构基础的数组
数组实际上是为了存储多个数据而在内存上集中分配出的一块内存空间,并且为这块空间整体赋予了一个名字。

- 要点 3:了解数组的应用——作为典型算法的数据结构
数组是数据结构的基础,只要使用数组就能通过程序实现各种各样的算法以处理大量的数据。
- 要点 4:了解并掌握典型数据结构的类型和概念

1 | “栈”(Stack):数据从下往上堆积,按照从上往下的顺序取数据。这种存取方式为LIFO(Last In First Out,后进先出) |

1 | “队列”(Queue):等待做某事而排成的队,最先被存入的数据最先被处理,被称为FIFO(First In First Out,先进先出) |

1 | “链表”:几人手拉手排成一排,当某人松开一只手,去拉另一个人的手,这排人的排列顺序就改变了。 |

1 | “二叉树”:如图每个分叉点上一片叶子(相当于数据) |

- 要点 5:了解栈和队列的实现方法
栈和队列的相似点在于,它们都可以把不能立刻处理的数据暂时存储起来;不同点在于,栈对所存储数据的存取方式是 LIFO 的,而队列对所存储数据的存取方式是 FIFO 的。
在实现栈这种数据结构时,首先要定义一个数组和一个变量。数组中所包含的元素个数就是栈的大小(栈中最多能存放多少个数据)。变量中则存储着一个索引,指向存储在栈中最顶端的数据,该变量被称为“栈顶指针”。栈的大小可以根据程序的需求任意指定。
这个数组就是栈的基础。接下来编写两个函数,一个函数用于把数据存入到栈中,也叫作压入到栈中;另一个函数用于从栈中把数据取出来,也叫作从栈中弹出来。在这两个函数中,都需要更新栈中所存储的数据的总数,以及更新栈顶指针的位置。也就是说通过使用由数组、栈顶指针以及入栈函数和出栈函数所构成的集合,就能实现栈这种数据结构了。
为了实现队列这种数据结构,以下元素是必不可少的:
- 一个任意大小的数组;
- 一个用于存放排在队头的数据对应的索引的变量;
- 一个用于存放排在队尾的数据对应的索引的变量;
- 一对儿函数,分别用于把数据存入到队列中和从队列中把数据取出来。
如果数据一直存放到了数组的末尾,那么下一个存储位置就会折回到数组的开头。这样就相当于数组的末尾就和它的开头连接上了,于是虽然数组的物理结构是“直线”,但是其逻辑结构已经变成“圆环”了
- 要点 6:了解结构体的组成
所谓结构体(struct),就是把若干个数据项汇集到一处并赋予其名字后所形成的一个整体。就可以把结构体当作是一种数据类型,用它来定义变量。被汇集到结构体中的每个数据项都被称作“结构体的成员”。
只要巧妙地运用结构体的数组就可以实现链表和二叉树
- 要点 7:了解链表和二叉树的实现方法
链表是一种类似数组的数据结构,这个“数组”中的每个元素和另一个元素都好像是手拉着手一样。为了让各个元素“把手拉起来”,就需要在结构体中再添加一个成员。这种特殊的结构体可以称为“自我引用的结构体”。
在C 语言中,把存储着地址的变量称为“指针”。这里的“*”(星号)就是指针的标志。

Ptr 中存储着本元素接下来该与哪一个元素相连的信息,即下一个元素的地址。在链表的初始状态中,会按照元素在内存上的分布情况设定成员Ptr 的值。
因为Ptr 中存储的是与下一个数组元素的连接信息,所以只要替换了Ptr 的值,就可以对数组中的元素排序,使元素的排列顺序不同于其在内存上的物理排列顺序。

。在二叉树的实现中,用的还是自我引用的结构体,只不过要改为要带有两个连接信息的成员的自我引用结构体。
二叉树多用于实现那些用于搜索数据的算法,比如“二分查找法”。比起只使用链表,使用二叉树能够更快地找到数据。因为搜索数据时并不是像在简单数组中那样沿一条线搜索,而是寻着二叉树不断生长出来的两根树杈中的某一枝搜索,这样就能更快地找到目标数据了。





