- 数组是一种直接利用内存物理结构(计算机的特性)的最基本的数据结构。只需使用for语句,就可以连续地处理数组中所存储的数据,实现各种各样的算法。但是在现实世界中也有一些数据结构,仅凭借数组是无法实现的,比如有的数据结构可以把数据堆积得像小山一样(栈),有的数据结构可以把数据排成一队(队列),有的数据结构可以任意地改变数据的排列顺序(链表),还有的数据结构可以把数据分为两路排列(二叉树),等等。为了用程序实现这些数据结构,就必须要设法改造数组,但是与之相应的内存的物理结构又是改变不了的。这可怎么办才好呢?——通过程序从逻辑上改变内存的物理结构,即数据在内存上呈现出的连续分布状态。
- 以下是主要数据结构及其特征
1.栈
栈”(Stack)的本意是干草堆。在牧场中,把喂家畜吃的干草堆积在地上就会形成一座小山。为了把干草堆成山就要从下往上不断地堆积。在程序中干草就相当于数据。而在给家畜喂食的时候,则要按照从上往下的顺序把堆积起来的干草(数据)取下来。也就是说,数据的使用顺序与堆积顺序是相反的。通常把这种存取方式称为LIFO(Last In First Out,后进先出),即最后被存入的数据是最先被处理的。在那些作为程序处理对象的实际业务中,可以用栈来模拟诸如堆积在桌子上的文件等场景。既然无法马上处理,就暂且先都堆放在栈里吧。
2.队列
“队列”(Queue)就是等待做某事而排成的队。在购票窗口前买票的乘客会排成一队。这就是现实世界中的队列。队列与栈正相反,排在队头的乘客可以最先买到车票。通常把这种形式称为FIFO(First In First Out,先进先出),即最先被存入的数据也是最先被处理的。当无法一下子处理完数据的时候,就可以暂且先把这些数据排成队。之后会介绍队列的数据结构,其实现方式一般是把数组的首尾相连,形成一个圆环。
3.链表
“链表”的概念就相当于几个人手拉着手排成一排(如图6.6所示)。某个人只要松开拉住的那只手,再去拉住另一只手,这一排人(相当于数据)的排列顺序就改变了。而只要先松开拉住的手,再让一个新人加入进来并拉住他的手,就相当于完成了数据的插入操作。
4.二叉树
“二叉树”的概念正如其名,就相当于一棵树。不过这棵树与自然界中的树稍有些不同,二叉树从树干开始分杈,树枝上又有分杈,但每次都只会分为两杈,在每个分杈点上有一片叶子(相当于数据)。稍后诸位就会了解到二叉树其实是链表的特殊形态。