刚入手了一本《程序员代码面试指南》,书中题目的代码都是 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
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
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
this->stackMin);
52 return
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->getStackMin());
echo ‘
’;
echo ‘最小值是:’,$myStack1->pop(),’
’;
echo '
’;
echo ‘弹出之后
’;
echo ‘StackData:’;
var_dump(
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