用栈和队列来构造灵巧的代码

102 阅读3分钟

这是我参与2022首次更文挑战的第38天,活动详情查看:2022首次更文挑战

用栈和队列来构造灵巧的代码

迄今为止,我们对数据结构的讨论都集中于它们在各种操作上表现出的性能。但其实,掌握多种数据结构还有助于简化代码,提高可读性。

栈和队列。事实上它们并不是全新的东西,只不过是多加了一些约束条件的数组而已。但正是这些约束条件为它们赋予了巧妙的用法。

具体一点说,栈和队列都是处理临时数据的灵活工具。在操作系统、打印任务、数据遍历等各种需要临时容器才能构造出美妙算法的场景,它们都大有作为。

处理临时数据就像是点餐。在菜做好并送到客人手上之前,订单是有用的,但过后,你无须保留那张订单。临时数据就是一些处理完便不再有用的信息,因此没有保留的必要。此外,就像出菜时应先出给早下单的客人,你可能还得注意数据按什么顺序去处理。栈和队列就正好能把数据按顺序处理,并在处理完成后将其抛弃。

存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下3条约束。

  • 只能在末尾插入数据。
  • 只能读取末尾的数据。
  • 只能移除末尾的数据。

你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能往上加,不能往中间塞,要拿碟子只能从上面拿,不能从中间拿(至少你不应该这么做)。绝大部分计算机科学家都把栈的末尾称为栈顶,把栈的开头称为栈底

尽管这些约束看上去令人很拘束,但很快你就会发现它们带来的好处。

我们先从一个空栈开始演示。

往栈里插入数据,也叫作压栈。你可以想象把一个碟子压在其他碟子上的画面。

首先,将5压入栈中。

这没什么特别的,就如往数组插入数据一样平常。

接着,将3压入栈中。

再将0压入栈中。

注意,每次压栈都是把数据加到栈顶(也就是栈的末尾)。如果想把0插入到栈底或中间,那是不允许的,因为这就是栈的特性:只能在末尾插入数据。

从栈顶移除数据叫作出栈。这也是栈的限制:只能移除末尾的数据。

来把栈中的一些数据弹出。

首先,弹出0。

现在剩下两个元素,5和3。

接着,弹出3。

这就剩下5了。

压栈和出栈可被形容为LIFO(last in,first out)后进先出。解释起来就是最后入栈的元素,会最先出栈。就像无心向学的学生,最迟到校的总是他,最早回家的也是他。