PHP實現簡單順序棧

科技小能手發表於2017-11-12

棧與陣列:php陣列也有壓入壓出的方法array_push 和array_shift。是不是陣列就是棧資料結構?或者明明陣列就可完成,為何還要棧

解答:去全國各地都可以用雙腿走到,為何選擇火車飛機?陣列就是腿,棧就是火車飛機。首先不相等,其次棧可以讓我們集中精力去解決更加核心的業務需求。


簡單順序棧實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
class Data{
   private $data
   public function __construct($data){
        $this->data=$data;         
   
 
   public function getData(){
        return $this->data;
   }
 
class Stack{
    private $size;
    private $top;//棧頂的標識
    private $stack=array();
 
    public function __construct($size){
        return $this->Init_Stack($size);
    }
    public function Init_Stack($size){
        $this->size=$size;
        $this->top=-1;//這裡棧頂的位置元素
    }
 
    public function Empty_Stack(){
        if($this->top==-1) return 1;
        else
            return 0;
    }
 
    public function Full_Stack(){
        if($this->top<($this->size-1)) return 0;
        else
            return 1;
    }
//入棧
//本來打算直接算入Data物件,後來試驗了下好像有個小問題,就是單例的問題吧,看來還是需要每次都新建一個
/**
*@param $data class Data 的成員
*
**/
    public function Push_Stack($data){
        if($this->Full_Stack()) echo "棧滿了";
        else
            $this->stack[++$this->top] = new Data($data);
    }
 
    //出棧
    public function Pop_Stack(){
        if($this->Empty_Stack()) echo "棧空無資料!";
        else
            unset($this->stack[$this->top--]);
    }
    //讀取棧頂元素
    public function Top_Stack(){
        return $this->Empty_Stack()?"棧空無資料":$this->stack[$this->top]->getData();
        /*return $this->Empty_Stack()?"棧空無資料!":$this->stack[$this->top]->getData(); */
    }
}
 
//測試
//$data1 =new Data(`hello`);
$data1=`mini`;
$stock =new Stack(5); 
$stock->Push_Stack(`jack`);
$stock->Push_Stack($data1);
$stock->Push_Stack($data1);
$stock->Push_Stack($data1);
$stock->Empty_Stack();
$stock->Pop_Stack();
$stock->Pop_Stack();
$stock->Pop_Stack();
//$stock->Pop_Stack();
////$stock->Push_Stack(``);
//$stock->
echo $stock->Top_Stack();
?>

關於迴圈連結串列和雙向連結串列,沒有再寫。順序儲存還是比較好理解。

補充關於棧的軟體應用:Word,PS,瀏覽器常用的撤銷或者後退

補充棧擁有線性表的所有特性:上面是可以補充進來幾個函式:DestroyStack(銷燬)ClearStack(清空)StackLength(長度)。所有函式只是一次演練,熟悉下思路,下次寫任何業務邏輯,符合需要的話可以直接使用該思想

本文轉自 jackdongting 51CTO部落格,原文連結:http://blog.51cto.com/10725691/1948667


相關文章