12 餐厅中的栈和队列(第2/3页)

“但这并不是最可怕的。看看他们是怎么处理这些土豆泥的。”

Frank眼睛扫了扫旁边那一大木碗的土豆泥。一个厨师正在往里面加刚出炉的土豆泥。那个厨师手里拿着一个大锅,正愉快地用一个长柄勺把土豆泥从锅中揽到碗中。过了一会儿Frank才意识到厨师只是将原来的土豆泥埋在了最下面。他的胃开始不舒服了。

“最下面的土豆泥放了多久了?”Frank问道,其实Frank并不想知道答案。

“别担心。他们至少每周会将这些木碗洗一次。所以再久也不过一周。”

Frank并没有感到欣慰。事实上,他感到非常不舒服。快速扫了一圈,Frank看到餐厅内几乎每个地方都在用后进先出的数据结构。当他看到装沙拉酱的大桶时,他不敢再看下去了,他感到既慌张又恶心。

“我们能做些什么?”Frank问道。

“用队列,”教授回答道,“队列几乎可以说是为餐厅量身定制的。”

“队列?”Frank问道。

“先进先出的数据结构,”Heappens教授解释道,“像栈一样,它们同样是用来储存东西的,并且也支持两种操作。你可以将一个东西放到队列的最后,也可以从最前面拿出一个东西来。这样,你拿出来的永远都是最先放进去的东西。”

Frank想象了一下每次都从一叠盘子的最底下拿盘子,多麻烦,于是问道:“但如何做呢?”

“这正是数据结构如何运作的问题。看看等三明治的人所排的队,那就是一个队列。现在队里面有四个人,而最前面的人已经等待的时间最长。”

正当Heappens教授说着,又有一个人开始排队了。“看,他走到了队列的最后。”教授说道。

Frank和教授看着那条队伍,直到排在第一位的人拿着自己的三明治走了。

“看,有人从队伍最前面离开了,”教授开心地说道,“这个餐厅需要更多的队列。所有餐厅都需要更多的队列。”

Frank想到了之前看到的土豆泥,意识到教授说的没错。数据的储存方式可以很大程度上影响到它被存取的方式。对于土豆泥的这种情况,存取的顺序是很重要的。

即便意识到这点很容易,Frank花了好几天才把队列这种数据结构用到了餐厅里。改变盘子和碗存取的方式相对简单一些,他只需要把原来的那堆盘子或碗拎起来,然后把新的放在最底下就好了。说服厨师让他们改变加菜的方式就困难多了,厨师们非常享受将一大勺一大勺的土豆泥揽到碗里的这个过程。最终,Frank提议让他们用两个碗,每次将那碗旧的土豆泥揽到新的土豆泥的碗里。虽然严格来说这还不是一个队列,但这样做既让厨师们依然可以享受到揽土豆泥的乐趣,也避免了旧的食物被埋在新的食物下面。

有一天,Frank需要顶替一个生病了的面包师。Frank坚持说后进先出地将面包装入烤箱对放在最后的面包是不公平的。所以他提出,每过25秒钟就要拿出烤箱中最后一块面包,并将其他面包往后推,然后在最前面放入一片新的面包。

如果烤箱有前后两个门的话,这将会是一个非常好的计划。不幸的是,餐厅用的烤箱只有一个门。这让Frank的计划实施起来变得非常困难。这样时不时地改变面包的位置的确能让每一块面包受热更加均匀。但Frank意识到自己加面包的速度根本赶不上烘烤进度,很快就有面包烤糊了,浓浓的黑烟从烤箱中飘了出来。

当其他厨师都在忙着拿水桶去救火时,Frank只是麻木地看着那烤糊了的面包。当他意识到队列也许不是对餐厅里的所有问题都适用时,他感到了一丝困惑和绝望。看来关于数据结构他需要学的还有很多。