隊列是一種廣泛使用的數據結構,遵循先進先出(FIFO)的原則。雖然PHP中數組可實現隊列功能,但直接操作數組可能導致效率降低。本文將講解如何利用兩個棧結構,實現高效的隊列操作,提升程序性能。
棧是一種後進先出(LIFO)的數據結構,主要操作包括入棧(push)和出棧(pop)。入棧將元素壓入棧頂,出棧則移除棧頂元素。
通過兩個棧實現隊列,一個作為輸入棧負責元素入隊,另一個作為輸出棧負責元素出隊。當輸出棧為空時,將輸入棧中的元素逐個彈出並壓入輸出棧,從而實現先進先出的隊列行為。
入隊操作相對簡單,只需將元素壓入輸入棧即可。
class Queue {
private $inputStack = [];
private $outputStack = [];
public function enqueue($item) {
array_push($this->inputStack, $item);
}
}
出隊操作先判斷輸出棧是否為空,若為空,則將輸入棧的所有元素彈出後壓入輸出棧,再從輸出棧彈出元素;若不為空,直接從輸出棧彈出元素。
public function dequeue() {
if (empty($this->outputStack)) {
while (!empty($this->inputStack)) {
array_push($this->outputStack, array_pop($this->inputStack));
}
}
if (!empty($this->outputStack)) {
return array_pop($this->outputStack);
}
return null;
}
以下示例展示如何使用兩個棧實現隊列的基本操作:
$queue = new Queue();
$queue->enqueue(1);
$queue->enqueue(2);
$queue->enqueue(3);
echo $queue->dequeue(); // 輸出1
echo $queue->dequeue(); // 輸出2
echo $queue->dequeue(); // 輸出3
利用兩個棧實現隊列可以有效避免數組頻繁移動帶來的性能問題。入隊操作簡單高效,出隊時通過元素轉移保證了先進先出的特性。雖然需要額外的棧空間,但整體提升了隊列操作的執行效率,尤其適合處理大量數據時的隊列操作需求。