PHP 程序員學數據結構與算法之《棧》

“要成高手,必練此功”。

要成爲優秀的程序員,數據結構和算法是必修的內容。而現在的Web程序員使用傳統算法和數據結構都比較少,因爲很多算法都是包裝好的,不用我們去操心具體的實現細節,如PHP的取棧操作array_pop,進棧操作array_push,都有指定的庫函數,導致我們對基礎算法的研究越來越少,最後成爲一個工具的傀儡而已。

所以我還是建議更多的coder從基礎開始學習。這篇就先講我們最熟悉的棧操作開始入手,讓我們熟悉棧。
  
   在這裏插入圖片描述
棧爲何物?

 口訣“後進先出”,這是我印象最深的一句話,也是老師一坨講解中,印象最深刻的。
 
 定義:棧是限制插入和刪除都只能發生在一個位置上進行的線性表,該位置是線性表的末端,叫做棧的頂。
 
 過程:先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。

在這裏插入圖片描述

分析:

  通過定義和過程,我們分析出數據結構(紅色標識),動作部分(藍色標識),以及動作的規則(黃色標識)。

請看:
在這裏插入圖片描述
組成成分:
數據:線性表(用array結構保存命名爲data),末端索引(用int結構保存命名爲end,初始值爲null——因爲開始線性表是沒有元素的,所以就沒有末端索引這麼一說,而且由於不斷取數據,添加數據,這個末端是變化的元素。)。

動作(方法):壓入(push:規則,放在線性表最後面),彈出(pop:規則,從最後取出,並且末端位置向前移動)。

在這裏插入圖片描述
代碼:

<?php
/* 模擬PHP數據結構棧*/
class array_a{

    private $_data = array();

    private $_end = null;   //當前指針,永遠指向棧的最頂端

    /** 入棧*/
    public function push($data){


            if($this->_end === null){
                $this->_end = 0;
            }else{

                 $this->_end ++;
            }
            $this->_data[$this->_end] = $data;
           

    }

    /** 出棧**/
    public function pop(){

        if(empty($this->_data)) return '';
        echo $this->_end;
        $data = $this->_data[$this->_end];

        //數據以取出,則要指針前移,數組數據刪除

        array_splice($this->_data, $this->_end);

        $this->_end --;
        return $data;
    }

    /** 獲取數組數據**/

     public function getData(){
        return $this->_data;
     }
}


$Data = new array_a();
$Data->push('lifei ni zhen shuai');
$Data->push('lifei ni zhen hao');
$Data->push('lifei ni zhen meng');
$Data->push('lifei ni zhen cha');

$data = $Data->pop();
var_dump($data);

var_dump($Data->getData());
?>

輸出結構:
在這裏插入圖片描述
在這裏插入圖片描述

總結:

以上是本人對棧的分析理解過程,由於我是一名php coder,所以我用php的角度去分析和編碼。

如果是C語言去編碼,數組應該指定最大寬度,因爲C語言數組不像php數組能自行增長,必須要有一個初始寬度。

特此感謝:
PHP 程序員學數據結構與算法之《棧》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章