在 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 中模拟栈式数据结构的场景。