PHP实现双向队列
PHP实现双向队列
在 PHP 中,虽然标准库没有直接提供一个双向队列(Deque)的实现,但我们可以使用 SplDoublyLinkedList 类来实现这一功能。SplDoublyLinkedList 是一个双向链表,它允许我们在列表的头部和尾部进行插入和删除操作,这符合双向队列的基本特性。
下面是一个使用 SplDoublyLinkedList 实现双向队列的示例代码:
<?php
class Deque {
private $deque;
public function __construct() {
$this->deque = new SplDoublyLinkedList();
}
// 在队列尾部添加元素
public function enqueue($value) {
$this->deque->push($value);
}
// 在队列头部添加元素(也可以看作是在队列的另一端添加)
public function enqueueFront($value) {
$this->deque->unshift($value);
}
// 从队列尾部移除元素
public function dequeue() {
if ($this->isEmpty()) {
throw new UnderflowException("Deque is empty, cannot dequeue.");
}
return $this->deque->pop();
}
// 从队列头部移除元素(也可以看作是在队列的另一端移除)
public function dequeueFront() {
if ($this->isEmpty()) {
throw new UnderflowException("Deque is empty, cannot dequeue from front.");
}
return $this->deque->shift();
}
// 获取队列头部的元素(不移除)
public function peek() {
if ($this->isEmpty()) {
throw new UnderflowException("Deque is empty, cannot peek.");
}
return $this->deque->bottom();
}
// 获取队列尾部的元素(不移除)
public function peekEnd() {
if ($this->isEmpty()) {
throw new UnderflowException("Deque is empty, cannot peek at end.");
}
return $this->deque->top();
}
// 检查队列是否为空
public function isEmpty() {
return $this->deque->isEmpty();
}
// 获取队列中的元素数量
public function count() {
return $this->deque->count();
}
// 打印队列中的元素(用于调试)
public function printDeque() {
echo implode(' <-> ', $this->deque->toArray()) . "\n";
}
}
// 示例用法
$deque = new Deque();
$deque->enqueue(1);
$deque->enqueue(2);
$deque->enqueueFront(0);
$deque->printDeque(); // 输出: 0 <-> 1 <-> 2
echo "Peek: " . $deque->peek() . "\n"; // 输出: Peek: 1
echo "Dequeue: " . $deque->dequeue() . "\n"; // 输出: Dequeue: 1
$deque->printDeque(); // 输出: 0 <-> 2
echo "Peek end: " . $deque->peekEnd() . "\n"; // 输出: Peek end: 2
echo "Dequeue front: " . $deque->dequeueFront() . "\n"; // 输出: Dequeue front: 0
$deque->printDeque(); // 输出: 2
?>
在这个示例中,Deque 类封装了一个 SplDoublyLinkedList 实例,并提供了标准的双向队列操作,如 enqueue(在尾部添加)、enqueueFront(在头部添加)、dequeue(从尾部移除)、dequeueFront(从头部移除)、peek(查看头部元素)、peekEnd(查看尾部元素)、isEmpty(检查是否为空)和 count(获取元素数量)。此外,还有一个 printDeque 方法用于打印队列中的元素,便于调试。
请注意,SplDoublyLinkedList 的 push 方法在尾部添加元素,unshift 方法在头部添加元素,pop 方法从尾部移除元素,而 shift 方法从头部移除元素。这些操作使得 SplDoublyLinkedList 非常适合用作双向队列的底层实现。