1

我在这里有点困惑。

文章

队列是一种线性结构,它遵循执行操作的特定顺序。顺序是先进先出 (FIFO)。队列的一个很好的例子是资源的任何消费者队列,其中首先服务的消费者。堆栈和队列之间的区别在于移除。在堆栈中,我们删除最近添加的项目;在队列中,我们删除最近最少添加的项目。

FIFO(先进先出)和LILO(后进后出)是一样的说法对吗?

对于堆栈:它是否与 LIFO(后进先出)和 FILO(先进后出)相同?

但是从来没有人使用过 LILO 和 FILO。

4

2 回答 2

2

是的,在堆栈和队列的情况下,任何一种命名约定在技术上都是准确的。

考虑一个大小为 4 的队列。我们将“o”排入队列,然后将“x”排入队列,并将它们按相应的顺序放入队列中。

     +---+---+---+---+
Back |   |   | x | o | Front
     +---+---+---+---+

当我们出队时,最靠近前面的元素从队列中移除,队列的其余部分“向上移动”,如下所示:

     +---+---+---+---+
Back |   |   |   | x | Front (o dequeued)
     +---+---+---+---+

在这个抽象示例中,“o”是第一个入队的元素(先进),也是第一个出队的元素(先出)。

然后,我们可以再次出队,并接收 x。

     +---+---+---+---+
Back |   |   |   |   | Front (x dequeued)
     +---+---+---+---+

现在,从这个出队很容易看出,“x”是最后一个入队的元素(后进),也是最后一个出队的元素(后出)。

因此,FIFO 和 LILO 是等效的术语。

为简洁起见,我将压缩堆栈的示例:

+---+    +---+    +---+
|   |    |   |    |   |
+---+    +---+    +---+
|   |    |   |    |   |
+---+    +---+    +---+
|   |    | x |    |   |
+---+    +---+    +---+
| o |    | o |    | o |
+---+    +---+    +---+
Push o   Push x   Pop

在第二步中,“x”成为压入堆栈的最后一个元素(last in)。然后,当我们弹出时,堆栈的顶部元素被删除,它仍然是“x”(最后出)。

如果我们第二次弹出,我们可以得到“o”。这个元素是第一个,也是最后一个被删除的元素。因此,行为可以用 LIFO 和 FILO 来描述。

至于为什么使用一种命名约定而不是另一种命名约定, - ("/) -

于 2019-05-16T14:33:14.137 回答
2

如前所述,LILO 和 FIFO 基本相同,除了结构/内存的状态。使用 FIFO(先进先出),第一个压入的元素将是第一个弹出的元素(如果堆栈一开始是空的)。如果队列不为空并且我们推送一个元素“A”,对于代理来说,“first in”元素是“A”,但我们将弹出存储在队列中的第一个元素,它可以是之前存储的任何元素!只有当队列为空时,“先进”元素才会作为“先进”元素弹出。LILO 队列不关心队列的状态:无论之前推送或存储在队列中的元素数量如何,最后推送的元素将是最后弹出的元素。 所以,严格来说,FIFO 结构还告诉我们有关堆栈的更多信息:默认为空;LILO 结构的行为方式相同,但不关心瞬态(队列状态)。FILO 和 LIFO 的逻辑相同。

于 2020-12-24T02:36:24.337 回答