在PHP 中,棧(Stack)是一種先進後出(LIFO, Last In First Out)的數據結構。在棧中,元素的添加與移除都是從棧頂進行的。棧常用於實現一些需要後進先出(LIFO)邏輯的場景,如撤銷操作、瀏覽歷史等。雖然PHP 沒有內建的棧數據結構,但我們可以使用數組來模擬棧的操作。
在棧的常見操作中,有一個常見的需求:查看棧頂元素,但並不刪除它。這就是所謂的peek操作。對於PHP 數組來說,雖然我們可以使用array_pop()函數來彈出棧頂元素,但peek操作的目的在於僅查看棧頂元素而不改變棧本身的狀態。
PHP 中有一個非常有用的函數叫做end() ,它返回數組中的最後一個元素。我們可以利用它來實現棧的peek 操作。讓我們來看一下具體實現方式。
我們首先模擬一個簡單的棧,使用PHP 數組來模擬棧的操作。
<?php
// 初始化棧
$stack = [];
// 入棧操作
array_push($stack, 'first');
array_push($stack, 'second');
array_push($stack, 'third');
// 輸出棧的狀態
print_r($stack);
?>
運行該代碼,輸出會是:
Array
(
[0] => first
[1] => second
[2] => third
)
此時,棧頂元素是'third' 。
要實現peek 操作,我們可以利用end()函數。 end()函數會返回數組的最後一個元素,即棧頂元素。
<?php
// Peek 操作:查看棧頂元素
$top = end($stack);
// 輸出棧頂元素
echo "棧頂元素是: " . $top . PHP_EOL;
?>
此時輸出為:
棧頂元素是: third
end()函數會將數組的內部指針移動到最後一個元素,但並不會刪除該元素。因此,棧在執行peek 操作後依然保持不變。這個特性非常適合棧式結構中的peek 操作,因為我們只需要查看棧頂的元素,而不希望修改棧。
空棧的情況:如果棧為空, end()返回false 。因此在使用end()之前,最好檢查棧是否為空,以避免錯誤。
<?php
if (!empty($stack)) {
$top = end($stack);
echo "棧頂元素是: " . $top . PHP_EOL;
} else {
echo "棧為空,無法執行 peek 操作。" . PHP_EOL;
}
?>
數組的內部指針: end()函數改變了數組的內部指針,但對於棧操作來說,內部指針的改變不會影響棧的其它操作(如入棧、出棧等)。
以下是一個包含入棧、出棧和peek 操作的完整示例代碼:
<?php
// 初始化棧
$stack = [];
// 入棧操作
array_push($stack, 'first');
array_push($stack, 'second');
array_push($stack, 'third');
// Peek 操作:查看棧頂元素
if (!empty($stack)) {
$top = end($stack);
echo "棧頂元素是: " . $top . PHP_EOL;
} else {
echo "棧為空,無法執行 peek 操作。" . PHP_EOL;
}
// 出棧操作:移除棧頂元素
$removed = array_pop($stack);
echo "移除的元素是: " . $removed . PHP_EOL;
// Peek 操作:再次查看棧頂元素
if (!empty($stack)) {
$top = end($stack);
echo "棧頂元素是: " . $top . PHP_EOL;
} else {
echo "棧為空,無法執行 peek 操作。" . PHP_EOL;
}
?>
輸出結果:
棧頂元素是: third
移除的元素是: third
棧頂元素是: second
通過使用end()函數,我們可以很方便地實現棧的peek 操作,查看棧頂元素而不改變棧的狀態。這種方法簡單且高效,非常適合PHP 中模擬棧式數據結構的場景。