剛入手了一本《程式員代碼面試指南》,書中題目的代碼都是 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 s t a c k M i n = a r r a y ( ) ; 910 / / 向 棧 中 壓 入 數 據 11 p u b l i c f u n c t i o n p u s h ( 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 v a l = a r r a y p o p ( 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 c o u n t = c o u n t ( count = count( count=count(this->stackMin);
52 return t h i s − > s t a c k M i n [ this->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( m y S t a c k 1 − > g e t S t a c k D a t a ( ) ) ; e c h o ′ S t a c k M i n : ′ ; v a r d u m p ( myStack1->getStackData()); echo 'StackMin:'; var_dump( myStack1−>getStackData());echo′StackMin:′;vardump(myStack1->getStackMin());
echo ‘
’;
echo ‘最小值是:’,$myStack1->pop(),’
’;
echo '
’;
echo ‘彈出之後
’;
echo ‘StackData:’;
var_dump( m y S t a c k 1 − > g e t S t a c k D a t a ( ) ) ; e c h o ′ S t a c k M i n : ′ ; v a r d u m p ( myStack1->getStackData()); echo 'StackMin:'; var_dump( myStack1−>getStackData());echo′StackMin:′;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