php实现一个双向队列
双向队列的实现方式
在PHP中,双向队列(Deque)可以通过数组或SplDoublyLinkedList类实现。双向队列允许从队列的前端和后端进行插入和删除操作。
使用数组实现双向队列
PHP数组本身支持从头部和尾部操作元素,可以通过array_push、array_pop、array_shift和array_unshift函数实现双向队列的基本功能。
class Deque {
private $queue = [];
// 从队尾入队
public function pushBack($item) {
array_push($this->queue, $item);
}
// 从队尾出队
public function popBack() {
return array_pop($this->queue);
}
// 从队首入队
public function pushFront($item) {
array_unshift($this->queue, $item);
}
// 从队首出队
public function popFront() {
return array_shift($this->queue);
}
// 获取队列元素数量
public function size() {
return count($this->queue);
}
// 检查队列是否为空
public function isEmpty() {
return empty($this->queue);
}
}
使用SplDoublyLinkedList实现双向队列
PHP的SPL(Standard PHP Library)提供了SplDoublyLinkedList类,它原生支持双向队列操作,性能优于数组实现。
class Deque {
private $list;
public function __construct() {
$this->list = new SplDoublyLinkedList();
}
// 从队尾入队
public function pushBack($item) {
$this->list->push($item);
}
// 从队尾出队
public function popBack() {
return $this->list->pop();
}
// 从队首入队
public function pushFront($item) {
$this->list->unshift($item);
}
// 从队首出队
public function popFront() {
return $this->list->shift();
}
// 获取队列元素数量
public function size() {
return $this->list->count();
}
// 检查队列是否为空
public function isEmpty() {
return $this->list->isEmpty();
}
}
使用示例
$deque = new Deque();
// 添加元素
$deque->pushBack(1);
$deque->pushFront(2);
$deque->pushBack(3);
// 移除元素
echo $deque->popFront(); // 输出2
echo $deque->popBack(); // 输出3
性能考虑
对于频繁的双端操作,SplDoublyLinkedList比数组实现更高效,因为数组的头部操作(array_shift/unshift)需要重新索引所有元素。在大型数据集上,SplDoublyLinkedList表现更优。







