我为什么要关心?
我们每天都在编程中使用这些数据结构。
即使你已经熟悉了它们,偶尔回顾一下也是很有帮助的。
在5分钟或更短时间内。
正如我们在介绍中所说,如果一个数据结构的元素形成一个序列,那么它就是 "线性 "的。
这意味着该数据结构有一个第一个和最后一个元素,每个元素都与前一个和后一个元素相连。
- 一个 "数组 "是一个线性数据结构;项目是按顺序存储的。
- 图 "不是一个线性数据结构;任何节点都可以与图中的任何其他节点相连--没有固定的 "顺序"。
(如果你对图不熟悉,不要担心--即将出版的新闻通讯将对其进行详细的探讨)。
让我们来看看一些常见的线性数据结构...
数组
如果你做过任何编程,你几乎肯定熟悉数组的概念。
数组就像一个书架;项目彼此相邻存放,但我们可以跳到任何我们喜欢的项目上阅读。
数组中的项目有一个 "索引",使我们可以直接引用它们。
跳到我们喜欢的任何项目上读取其值的能力被称为 "随机访问",是数组的一个巨大优势。
我们认为这是理所当然的,但这并不是许多其他 "线性数据结构 "所具有的属性,正如你将在下面看到的。
当我们分配一个数组时,我们必须预先确定我们需要多少空间。
如果我们填满了我们的数组,我们就必须停下来,再分配一些空间。这意味着,虽然正常插入数组的速度非常快,但偶尔我们不得不暂停一小段时间,使数组变大--这需要一些时间。
链接列表
链接列表是一种数据结构,其中每个项目都指向下一个。我们不能像使用数组那样直接跳到任何元素。相反,我们必须依次访问它们。
链接列表很有用,因为与数组不同,我们不需要预先决定我们需要多少空间。如果我们需要添加一个新的项目,我们只需要把它加到最后。
这意味着添加第200个项目的成本与添加第2个项目的成本相同。这种可预测的性能是链表的一个优势。
通过简单地改变一些 "下一个 "指针,从链表的中间添加或删除一个项目也很容易。
下面是我们如何从一个链表中删除一个项目。
这在数组中更难做到,因为我们必须移动所有剩余的项目,以考虑到新的或删除的项目。
链接列表的一个变种是 "双链接列表",其中每个元素不仅指向下一个元素,还指向上一个元素。
这意味着我们可以按任一顺序遍历数据结构,但仍有链接列表的优点。
队列
队列是一个 "先进先出"(FIFO)的数据结构。这意味着项目的读取顺序与它们的插入顺序相同。
这就像商店里的排队一样,第一个加入队列的人就是第一个被服务的人。
打印机队列是这种数据结构使用的一个好例子。打印机将按照排队的顺序来打印项目。如果你最后才把你的文件送到打印机,它将是最后一个被打印的东西。
队列作为 "缓冲器 "也很有用。
假设我们有两个独立的系统,一个负责读取信息,一个负责处理信息。我们不希望读取消息的系统在监听另一条消息之前必须等待每条消息被处理。
在它们之间放置一个队列可以让我们将这些系统 "去耦"。读取过程可以继续向队列中添加项目,安全地知道处理过程将从队列中提取项目并最终处理它们--不需要等待。
堆栈
堆栈是一个 "后进先出 "的数据结构;最后一个被添加的项目是第一个被读取的项目。
你可以把它想象成一摞盘子,最后加入的盘子就是我们要再拿下来的第一个盘子。
例如,你可能会用一个堆栈来实现 "撤销 "功能。当用户点击'撤销'按钮时,用户执行的最后一项任务就是第一个被撤销的任务。
我们每天在运行代码时看到的'调用堆栈'也是堆栈的一个很好的例子,但这是未来通讯的一个主题
想了解更多吗?
请看这些链接: