当前位置: 首页> 最新文章列表> 用 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 中模拟栈式数据结构的场景。