當前位置: 首頁> 最新文章列表> 用end() 實現棧式結構中的peek 操作

用end() 實現棧式結構中的peek 操作

M66 2025-06-05

在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 操作?

要實現peek 操作,我們可以利用end()函數。 end()函數會返回數組的最後一個元素,即棧頂元素。

 <?php
// Peek 操作:查看棧頂元素
$top = end($stack);

// 輸出棧頂元素
echo "棧頂元素是: " . $top . PHP_EOL;
?>

此時輸出為:

 棧頂元素是: third

為什麼使用end()

end()函數會將數組的內部指針移動到最後一個元素,但並不會刪除該元素。因此,棧在執行peek 操作後依然保持不變。這個特性非常適合棧式結構中的peek 操作,因為我們只需要查看棧頂的元素,而不希望修改棧。

注意事項

  1. 空棧的情況:如果棧為空, end()返回false 。因此在使用end()之前,最好檢查棧是否為空,以避免錯誤。

 <?php
if (!empty($stack)) {
    $top = end($stack);
    echo "棧頂元素是: " . $top . PHP_EOL;
} else {
    echo "棧為空,無法執行 peek 操作。" . PHP_EOL;
}
?>
  1. 數組的內部指針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 中模擬棧式數據結構的場景。