線性表的順序存儲結構 (sequential list),也叫順序表中,存和讀數據時間復雜度為 O(1),插入和刪除數據時間復雜度為 O(n)。
線性表優點:
1.無需為表中元素之間的邏輯關系而額外增加存儲空間
2.可以快速存取表中任一位置的元素
線性表缺點:
1.插入和刪除操作需要移動大量元素
2.當線性表長度變化較大時,難以確定存儲空間的容量 (這個對 php 不是問題,而且貌似php只能申請動態數組。。。)
3.造成存儲空間的碎片
下面是 php 的實現
<?php
/**
* @author Dongjie LIU
* @version chinese
*
*順序表 (sequential list):線性表的順序存儲結構
*需要3個屬性,數組,最大存儲容量,線性表長度,
*但由于php 特性,無法在初始化時定義數組長度,
*故只定義數組一個屬性
*
* 線性表基本操作包括
* 1.線性表表初始化操作 __contruct()
* 2.清空線性表 __destruct()
* 3.判斷線性表是否為空 listEmpty()
* 4.返回線性表元素個數 listLength()
* 5.根據下標返回線性表中的某個元素 getElem()
* 6.返回線性表中某個元素的位置 locateElem()
* 7.根據給定位置在線性表中插入元素 listInsert()
* 8.根據給定位置在線性表中刪除元素 listDelete()
*/
class seqList{
private $seq_list; //順序表
/**
* 順序表初始化
*
* @param mixed $seq_list
* @return void
*/
public function __construct($seq_list=array()){
$this->seq_list = $seq_list;
}
/**
* 清空順序表
*
* @return void
*/
public function __destruct(){
unset($this->seq_list);
}
/**
* 判斷順序表是否為空
*
* @return bool 為空返回true,否則返回false
*/
public function listEmpty(){
return empty($this->seq_list);
}
/**
* 返回順序表元素個數
*
* @return int
*/
public function listLength(){
return count($this->seq_list);
}
/**
* 返回順序表中下標為i的元素值
*
* @param int i
* @return mixed 如找到返回元素值,否則返回false
*/
public function getElem($i){
if ($i > 0 && $i <= $this->listLength()) {
return $this->seq_list[$i-1];
}else{
return false;
}
}
/**
* 在順序表中查找與給定值 $value 相等的元素,
* 這里沒有考慮 $value 為數組的情況
*
* @param mixed $value
* @return mixed 如查找成功,返回該元素在表中序號,否則返回 0
*/
public function locateElem($value){
if (in_array($value, $this->seq_list)) {
$i = 0;
foreach ($this->seq_list as $key=>$val) {
if (strcmp($value, $val) === 0){
//若存在多個元素與匹配值相等
if ($i == 0) {
$i = $key + 1;
}else{
$i .= ",".($key + 1);
}
}
}
return $i;
}else{
return false;
}
}
/**
* 在指定位置 i 插入一個新元素 $value
*
* @param int $i
* @param mixed $value
* @return bool 插入成功返回 true, 否則返回 false
*/
public function listInsert($i, $value){
//三種情況:插入位置不合理,元素加在末尾和其他
if ($i > $this->listLength()+1 || $i < 1) {
return false;
}elseif ($i == $this->listLength()+1) {
$this->seq_list[$i-1] = $value;
}else{
//從 $i-1 到最后的元素位置向后移動一位
for ($k = $this->listLength()-1; $k >= $i-1; $k--) {
$this->seq_list[$k+1] = $this->seq_list[$k];
}
$this->seq_list[$i-1] = $value;
}
return true;
}
/**
* 刪除順序表中 i 位置的元素, 并用 $value 返回其值
*
* @param int $i
* @return mixed 刪除成功返回 $value,否則返回 false
*/
public function listDelete($i){
//兩種情況:插入位置不合理和其他
if ($i <= 0 || $i > $this->listLength()) {
return false;
}else{
$value = $this->seq_list[$i-1];
for ($k=$i-1; $k < $this->listLength()-1; $k++) {
$this->seq_list[$k] = $this->seq_list[$k+1];
}
unset($this->seq_list[$this->listLength()-1]);
return $value;
}
}
}
?>免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。