了解队列

队列是另一种特殊的线性数据结构,遵循先进先出(FIFO)原则。操作有两端:一端用于向队列追加,一端用于从队列移除。这与堆栈不同,在堆栈中,我们使用一端进行添加和删除操作。插入操作总是在后部进行。元素的移除则在前端进行。向队列中添加新元素的过程称为 enqueue,移除元素的过程称为 dequeue。在不移除元素的情况下查看队列前端元素的过程称为 "偷看",类似于堆栈的顶层操作。下图描述了队列的表示方法:

image 2023 11 07 18 56 49 471

现在,如果我们为队列定义一个接口,它将看起来像这样:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-07.adoc - include::example$Chapter04/5.php[]

现在,我们可以使用不同的方法来实现队列,就像使用堆栈一样。首先,我们将使用 PHP 数组来实现队列,然后是 LinkedList,最后是 SplQueue

使用 PHP 数组实现队列

现在我们将使用 PHP 数组来实现队列数据结构。我们已经看到可以使用 array_push()函数在数组末尾添加一个元素。为了移除数组的第一个元素,我们可以使用 PHP 的 array_shift() 函数,而对于 peek 函数,我们可以使用 PHP 的 current() 函数。下面是根据我们的讨论编写的代码:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-07.adoc - include::example$Chapter04/5.php[]

在这里,我们保持了与堆栈相同的原则。我们要定义一个固定大小的队列,并对溢出和下溢进行检查。为了运行队列实现,我们可以考虑将其用作呼叫中心应用程序的代理队列。下面是使用队列操作的代码:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-07.adoc - include::example$Chapter04/5.php[]

输出结果如下:

Fred
John
Keith

使用链表实现队列

与堆栈的实现一样,我们将使用第 3 章 "使用链接表" 中的链接表实现来实现队列。我们可以使用 insert() 方法来确保总是在末尾插入。我们可以使用 deleteFirst() 进行去队列操作,使用 getNthNode() 进行偷看操作。下面是使用链表实现队列的示例:

Unresolved include directive in modules/ROOT/pages/ch04/ch4-07.adoc - include::example$Chapter04/6.php[]