天天看點

算法與資料結構題目的 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 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=arrayp​op(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 − &gt; s t a c k M i n [ 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( m y S t a c k 1 − &gt; 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-&gt;getStackData()); echo &#x27;StackMin:&#x27;; var_dump( myStack1−>getStackData());echo′StackMin:′;vard​ump(myStack1->getStackMin());

echo ‘

’;

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

’;

echo '

’;

echo ‘彈出之後

’;

echo ‘StackData:’;

var_dump( m y S t a c k 1 − &gt; 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-&gt;getStackData()); echo &#x27;StackMin:&#x27;; var_dump( myStack1−>getStackData());echo′StackMin:′;vard​ump(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