算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

本文介绍如何使用PHP实现一个特殊的栈,该栈在具备基本栈功能的同时,还能在O(1)时间复杂度内获取栈中最小元素。通过维护两个栈,一个用于存储数据,另一个用于记录每步的最小值,确保了pop、push和getMin操作的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚入手了一本《程序员代码面试指南》,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象。

题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

要求:

① pop、push、getMin 操作的时间复杂度都是 O(1)

② 设计的栈类型可以使用现成的栈结构

PHP 当中没有栈和队列的概念(5.3 以后增加了 SplStack 类),但是可以用数组来模拟栈和队列,用到的方法有 array_push 和 array_pop

array_push:向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度

array_pop:array_pop() 函数删除并返回数组中的最后一个元素
1 <?php
2
3 class MyStack1 {
4
5 //普通栈
6 private $stackData = array();
7 //保存每一步最小值的栈
8 private stackMin=array();910//向栈中压入数据11publicfunctionpush(stackMin = array(); 9 10 //向栈中压入数据 11 public function push(stackMin=array();910//11publicfunctionpush(newNum) {
12 //向保存最小值的栈中压入数据
13 if(empty(KaTeX parse error: Expected '}', got 'EOF' at end of input: … array_push(this->stackMin, KaTeX parse error: Expected 'EOF', got '}' at position 22: …); 15 }̲else if(newNum <= KaTeX parse error: Expected '}', got 'EOF' at end of input: … array_push(this->stackMin, KaTeX parse error: Expected 'EOF', got '}' at position 22: …); 17 }̲ 18 //…this->stackData, KaTeX parse error: Expected 'EOF', got '}' at position 17: …ewNum); 20 }̲ 21 22 //弹…this->stackData)) {
27 throw new Exception(‘Your stack is empty.’);
28 }else{
29 //普通栈出栈
30 while(!empty($this->stackData)) {
31 val=arraypop(val = array_pop(val=arraypop(this->stackData);
32 if($val == $this->getMin()) {
33 $value = $val;
34 }
35 }
36 return $value;
37 }
38 }catch(Exception $e) {
39 echo KaTeX parse error: Expected 'EOF', got '}' at position 29: …(); 40 }̲ 41 } 42 4…this->stackMin)) {
48 throw new Exception(‘Your stack is empty.’);
49 }else{
50 //返回栈顶元素
51 count=count(count = count(count=count(this->stackMin);
52 return this−&gt;stackMin[this-&gt;stackMin[this>stackMin[count - 1];
53 }
54 }catch(Exception $e) {
55 echo $e->getMessage();
56 }
57 }
58
59 //查看普通栈
60 public function getStackData() {
61 return $this->stackData;
62 }
63
64 //查看保存最小值的栈
65 public function getStackMin() {
66 return $this->stackMin;
67 }
68 }
实例化并查看最小值:
$myStack1 = new MyStack1();

$myStack1->push(3);
$myStack1->push(4);
$myStack1->push(5);
$myStack1->push(1);
$myStack1->push(2);
$myStack1->push(1);
$myStack1->push(6);

echo ‘弹出之前
’;
echo ‘StackData:’;
var_dump(myStack1−&gt;getStackData());echo′StackMin:′;vardump(myStack1-&gt;getStackData()); echo &#x27;StackMin:&#x27;; var_dump(myStack1>getStackData());echoStackMin;vardump(myStack1->getStackMin());

echo ‘
’;
echo ‘最小值是:’,$myStack1->pop(),’
’;
echo '


’;

echo ‘弹出之后
’;
echo ‘StackData:’;
var_dump(myStack1−&gt;getStackData());echo′StackMin:′;vardump(myStack1-&gt;getStackData()); echo &#x27;StackMin:&#x27;; var_dump(myStack1>getStackData());echoStackMin;vardump(myStack1->getStackMin());
输出:
弹出之前
StackData:
array
0 => int 3
1 => int 4
2 => int 5
3 => int 1
4 => int 2
5 => int 1
6 => int 6
StackMin:
array
0 => int 3
1 => int 1
2 => int 1


最小值是:1


弹出之后
StackData:
array
empty
StackMin:
array
0 => int 3
1 => int 1
2 => int 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【工匠】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值