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

刚入手了一本《程序员代码面试指南》,书中题目的代码都是 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

 

posted @ 2015-10-22 21:10  nemo20  阅读(466)  评论(0编辑  收藏  举报
访客数:AmazingCounters.com
2016/05/17 起统计