栈的算法:
计算机内部空间是连续存储的,但是可以通过逻辑上改变内存的物理结构,数据在内存上呈现出的是连续分布状态
主要的典型数据结构
在实现栈这种数据结构时,首先要定义一个数组和一个变量。数组中所包含的元素个数就是栈的大小(栈中最多能存放多少个数据)。
变量中则存储着一个索引,指向存储在栈中最顶端的数据,该变量被 称为“栈顶指针”。
栈的大小可以根据程序的需求任意指定。假设最多 也就有 100 个数据,那么定义一个能把它们都存储下来的栈就可以了, 这样的话就可以定义一个元素数为 100 的数组。这个数组就是栈的基础。
接下来编写两个函数,一个函数用于把数据存入到栈中,也叫作压入到栈中;另一个函数用于从栈中把数据取出来,也叫作从栈中弹出来。在这两个函数中,都需要更新栈中所存储的数据的总数,以及更 新栈顶指针的位置。也就是说通过使用由数组、栈顶指针以及入栈函 数和出栈函数所构成的集合,就能实现栈这种数据结构了
2.了解结构体的组成:
要想理解用 C 语言程序实现链表和二叉树的方法,就必须先了解 何谓“结构体”。所谓结构体,就是把若干个数据项汇集到一处并赋予 其名字后所形成的一个整体。
例如,可以把学生的语文、数学、英语 的考试成绩汇集起来,做成一个叫作 TestResult 的结构体。
在 struct 这个关键词后面接上结构体的名字,然后在名字后面接上用“{”和“}”括起 来的程序块,并在程序块中列出若干个数据项。
一旦定义完结构体,就可以把结构体当作是一种数据类型,用它来定义变量。
如果把结构体 TestResult 用作数据类型并定义出了一个名 为 xiaoming 的变量(代表小明的成绩),那么在内存上就相应地分配出了一块空间,这块空间由用于存储 Chinese、Math、English 这三个成员 (Member)数据所需的空间汇集而来。被汇集到结构体中的每个数据项都被称作“结构体的成员”。
在为结构体的成员赋值或是读取成员的值时,可以使用形如 xiaoming.Chinese(表示小明的语文成绩)的表达式, 即以“.”分割变量和结构体的成员
如果要编写一个用于处理 100 名学生考试成绩的程序,就需要定 义一个以 TestResult 为数据类型、包含 100 个元素的数组。通过定义, 在内存上就分配出了一块空间,能够存储 100 个数据的集合,每个数据的集合中都含有 Chinese、Math、English 三个数据项。接下来只要巧妙地运用结构体的数组就可以实现链表和二叉树了。
3.了解链表和二叉树的实现方法:
下面讲解如何使用结构体的数组实现链表。链表是一种类似数组 的数据结构,这个“数组”中的每个元素和另一个元素都好像是手拉着 手一样。在现有的以结构体 TestResult 为数据类型的数组 Student[100] 中,为了让各个元素“把手拉起来”,就需要在结构体中再添加一个成员
这里的成员 Ptr 存储了数组中另一个元素的地址。在 C 语言中,把存储着地址的变 量称为“指针”。这里的“*”(星号)就是指针的标志。诸位可以看到, Ptr 就是以结构体 TestResult 的指针(struct TestResult*)为数据类型的 成员。这种特殊的结构体可以称为“自我引用的结构体”。之所以叫这 个名字,是因为在结构体 TestResult 的成员中,含有以 TestResult 的指 针为数据类型的成员,这就相当于 TestResult 引用了与自身相同的数据 类型。
在结构体 TestResult(已变成了自我引用的结构体)的数组中,每 个元素都含有一个学生的语文、数学、英语成绩以及成员 Ptr。Ptr 中存 储着本元素接下来该与哪一个元素相连的信息,即下一个元素的地址。 在链表的初始状态中,会按照元素在内存上的分布情况设定成员 Ptr 的值
在二叉 树的实现中,用的还是自我引用的结构体,只不过要改为要带有两个 连接信息的成员的自我引用结构体
二叉树多用于实现那些用于搜索数据的算法,比如“二分查找法”。 比起只使用链表,使用二叉树能够更快地找到数据。因为搜索数据时 并不是像在简单数组中那样沿一条线搜索,而是寻着二叉树不断生长 出来的两根树杈中的某一枝搜索,这样就能更快地找到目标数据了
因此数组对于算法和数据结构来说很重要,需要大家灵活使用