刚入手了一本《程序员代码面试指南》,书中题目的代码都是 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(); 9 10 //向栈中压入数据 11 public function push($newNum) { 12 //向保存最小值的栈中压入数据 13 if(empty($this->stackMin)) { 14 array_push($this->stackMin, $newNum); 15 }else if($newNum <= $this->getMin()) { 16 array_push($this->stackMin, $newNum); 17 } 18 //向普通栈中压入数据 19 array_push($this->stackData, $newNum); 20 } 21 22 //弹出栈顶元素 23 public function pop(){ 24 25 try { 26 if(empty($this->stackData)) { 27 throw new Exception('Your stack is empty.'); 28 }else{ 29 //普通栈出栈 30 while(!empty($this->stackData)) { 31 $val = array_pop($this->stackData); 32 if($val == $this->getMin()) { 33 $value = $val; 34 } 35 } 36 return $value; 37 } 38 }catch(Exception $e) { 39 echo $e->getMessage(); 40 } 41 } 42 43 //返回栈中的最小元素 44 public function getMin() { 45 46 try { 47 if(empty($this->stackMin)) { 48 throw new Exception('Your stack is empty.'); 49 }else{ 50 //返回栈顶元素 51 $count = count($this->stackMin); 52 return $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 '弹出之前<br />'; echo 'StackData:'; var_dump($myStack1->getStackData()); echo 'StackMin:'; var_dump($myStack1->getStackMin()); echo '**********<br />'; echo '最小值是:',$myStack1->pop(),'<br />'; echo '**********<br /><br />'; echo '弹出之后<br />'; echo 'StackData:'; var_dump($myStack1->getStackData()); echo 'StackMin:'; 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