資料結構 --- 線性表學習(php類比) 資料結構與演算法 資料結構 嚴蔚敏 c# 樹形資料結

來源:互聯網
上載者:User
線性表:零個或多個資料元素的有限序列(註:以下都是用的整型資料類比)

一 順序儲存結構(用一段地址連續的儲存單元一次儲存線性表的資料元素)
  1.1 三個屬性:儲存空間的起始位置;最大儲存容量;當前長度
  註:數組長度是存放線性表的儲存空間的長度(一般是不變的),不過語言可以動態增加容量,會帶來效能損耗;
    線性表長度是資料元素的個數;
    線性表是從1開始數的,對應數組0的位置
  1.2 擷取元素、插入元素、刪除元素(代碼中展示)

  1.3 順序結構優缺點:
    優點:無須為表示表中元素之間的邏輯關係而增加額外的儲存空間;可以快速地存取表中任一位置元素
    缺點:插入和刪除操作需要移動大量的元素;當線性表長度裱花較大時,難以確定儲存空間容量;造成儲存空間'片段'

    //用一維數組類比線性表class Sequential_Structure    {        //線性表的長度private$num = 0;        //數組長度private$len = 0;        //數組類比private$arr = array();        /**          * 初始化結構          * @param Int $len 最大數組長度          * @param Array $arr 數組          * @return           */publicfunction __construct($len, Array$arr)        {            $this->len = $len;            $length = count($arr);            if($length > 0 && $length <= $len)            {                $this->arr = $arr;                $this->num = $length;            }        }        /**          * 擷取線性表元素          * @param Int $i 需要擷取的第幾個元素          * @return           */publicfunction get_elem($i)        {            if($this->num == 0 || $i < 1 || $i > $this->num) //判斷尋找是否合理returnfalse;            return$this->arr[$i-1];    //返回資料,時間複雜度O(1)        }        /**          * 插入元素(順序結構中,插入元素後,後面所有的資料都要後移,平均時間複雜度O(1)):          * 如果插入位置不合理,失敗          * 如果線性長度大於數組長度,則返回錯誤或者動態增加容量          * 從最後一個元素開始向前遍曆到第i個位置,分別將它們向後移動一個位置          * 將元素插入i位置          * @param Int $i 需要插入到第幾個元素          * @param Int $elem 插入的節點          * @return bool          */publicfunction insert_elem($i,  $elem)        {            if($this->num == $this->len) //順序線性表已滿returnfalse;            if($i < 1 || $i > ($this->num+1)) //i不在範圍之內returnfalse;            if ($i <= $this->num)  //若資料插入位置不在表尾            {                for($k = $this->num-1; $k >= $i-1; --$k) //後面所有元素往後移動一位$this->arr[$k+1] = $this->arr[$k];            }            $this->arr[$i-1] = $elem; //插入元素            ++$this->num;            returntrue;        }        /**          * 刪除元素(順序結構中,插入元素後,後面所有的資料都要前移,平均時間複雜度O(1)):          * 如果刪除位元置不合理,失敗          * 將元素刪除          * 從最後刪除元素開始向後遍曆到最後,分別將它們向前移動一個位置          * @param Int $i 需要倉儲的第幾個元素          * @return bool          */publicfunction delete_elem($i)        {            if($this->num == 0) //線性表為空白returnfalse;            if($i < 1 || $i > $this->num) //刪除位元置不正確returnfalse;            if($i < $this->num) //刪除位元置不是表尾            {                for($k = $i; $k < $this->num; ++$k) //前移$this->arr[$k-1] = $this->arr[$k];            }                unset($this->arr[$this->num-1]);            --$this->num;            returntrue;        }        /**          * 擷取順序表          * @return           */publicfunction get_arr()        {            return$this->arr;        }        /**          * 擷取長度          * @return           */publicfunction get_len()        {           returnarray('num' => $this->num , 'len' => $this->len);        }    }        $link = new Sequential_Structure(10,[1,4,8,7]);    echo$link->get_elem(2);    var_dump($link->insert_elem(5,5));    var_dump($link->get_arr());    var_dump($link->get_len());    var_dump($link->delete_elem(1));    var_dump($link->get_arr());    var_dump($link->get_len());

輸出:
booleantruearray (size=5) 0 => int 1 1 => int 4 2 => int 8 3 => int 7 4 => int 5array (size=2) 'num' => int 5 'len' => int 10booleantruearray (size=4) 0 => int 4 1 => int 8 2 => int 7 3 => int 5array (size=2) 'num' => int 4 'len' => int 10

二 鏈表格儲存體結構(n個節點鏈結成一個鏈表)
  2.1 單鏈表(用數組類比)
    2.1.1 鏈表中第一個結點的儲存位置為頭指標(通常為了方便對鏈表進行操作,會在單鏈表的第一個結點前附設一個頭結點)
      注 頭指標:指向鏈表第一個結點的指標,若鏈表有頭結點,這是指向頭結點的指標;無論鏈表是否為空白,頭指標不為空白
        頭結點:放在第一元素的結點之前

/**      *    用一維數組類比線性表      * array('data'=>data,'cur'=>cur) data為存放資料,cur為下個數組元素下標      */class Simple_Link    {        //數組長度private$len = 0;        //數組類比private$arr = array();        //數組中閒置下標private$space_arr = array();        /**          * 初始化結構          * @param Int $len 最大數組長度          * @param Array $arr 數組          * @return           */publicfunction __construct($len, Array$arr)        {            $this->len = $len;            $length = count($arr);            $this->arr[0]['data'] = $length;            $this->arr[0]['cur'] = 0;            for($i = 0; $i < $length; ++$i)                $this->arr[$i]['cur'] = $i+1;  //類比鏈表的指向if($length)                $this->arr[$length]['cur'] = 0;  //最後一個結點指標空for($i = $length + 1; $i <= $len-$length ; ++$i) //空閑數組array_unshift($this->space_arr,$i);          }        /**          * 擷取線性表元素:          * 初始化$j從1開始          * 當$j<$i,遍曆鏈表          * @param Int $i 需要擷取的第幾個元素          * @return           */publicfunction get_elem($i)        {            if($i < 1 || $i > $this->arr[0]['data'])                 returnfalse;            $j = 1;            $cur = $this->arr[0]['cur'];  //指向第一個結點while($j < $i)            {                $cur = $this->arr[$cur]['cur'];                ++$j;            }                    return$this->arr[$cur]['data'];        }        /**          * 插入元素:          * 初始化$j從1開始          * 當$j<$i,遍曆鏈表          * 將元素插入i位置          * @param Int $i 需要插入到第幾個元素          * @param Int $elem 插入的節點          * @return bool          */publicfunction insert_elem($i, $elem)        {            $len = $this->arr[0]['data'] + 1;            if($i < 1 || $i > $len)                 returnfalse;            $j = $this->malloc(); //擷取空閑下標if(!$j)                returnfalse;            $this->arr[$j]['data'] = $elem;                        $k = 1;            $index = 0;            $cur = !empty($this->arr[0]['cur']) ? $this->arr[0]['cur'] : 0;  //指向第一個結點while($k < $i)            {                //記錄當前cur和下一個cur$index = $cur;                  $cur = $this->arr[$index]['cur'];                ++$k;            }            //改變指標指向$this->arr[$index]['cur'] = $j;            $this->arr[$j]['cur'] = $cur;            ++$this->arr[0]['data'];            returntrue;        }        /**          * 刪除元素:          * 初始化$j從1開始          * 當$j<$i,遍曆鏈表          * 將i位置刪除          * @param Int $i 需要刪除第幾個元素          * @return bool          */publicfunction delete_elem($i)        {            $len = $this->arr[0]['data'];            if($i < 1 || $i > $len)                 returnfalse;                        $k = 1;            $index = 0;             $cur = !empty($this->arr[0]['cur']) ? $this->arr[0]['cur'] : 0;  //指向第一個結點while($k < $i)            {                //記錄當前cur和下一個cur$index = $cur;                  $cur = $this->arr[$index]['cur'];                ++$k;            }            //改變指標指向$this->arr[$index]['cur'] = $this->arr[$cur]['cur'];                    $this->free($cur);            unset($this->arr[$cur]);            --$this->arr[0]['data'];            returntrue;        }        /**          * 擷取閒置結點下標,也就是相當於申請一個空結點          * @return           */privatefunction malloc()        {            if(empty($this->space_arr))                returnfalse;            returnarray_pop($this->space_arr);        }        /**          * 釋放結點          * @param Int $cur 需要回收的結點下標          */privatefunction free($cur)        {            array_push($this->space_arr, $cur);        }        /**          * 列印          * @return           */publicfunction print_arr()        {            $i = 0;            if(!empty($this->arr[0]['data']))            {    while($this->arr[$i]['cur'])                {                    $i = $this->arr[$i]['cur'];                    echo$this->arr[$i]['data'].' ';                }            }        }        /**          * 擷取長度          * @return           */publicfunction get_len()        {           returnarray('num' => $this->arr[0]['data'] , 'len' => $this->len);        }    }    $link = new Simple_Link(10,array());    var_dump($link->insert_elem(1,5));    var_dump($link->insert_elem(2,4));    var_dump($link->insert_elem(1,6));    var_dump($link->delete_elem(3));    echo$link->print_arr();    var_dump($link->get_len());                輸出:        booleantruebooleantruebooleantruebooleantrue        6 5        array (size=2)          'num' => int 2          'len' => int 10           

以上就介紹了資料結構 --- 線性表學習(php類比),包括了資料結構,---方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.