php 线性表,线性表(1):线性表顺序存储结构的php实现

线性表的顺序存储结构 (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 

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 listLength()-1; $k++) {

$this->seq_list[$k] = $this->seq_list[$k+1];

}

unset($this->seq_list[$this->listLength()-1]);

return $value;

}

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值