一、概念

把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里,元素间的顺序关系由它们的存储顺序自然表示。

逻辑顺序与物理顺序一致

元素之间的关系以元素在计算机内的“物理位置相邻”来体现

二、基本形式

图a)顺序表的基本形式,数据元素本身连续存储,每个元素的存储单元固定大小相同。元素的下标是逻辑地址,元素的物理地址(内存实际地址)可以通过存储区的起始地址Loc(e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,所以访问指定元素不用从头遍历即可通过计算得到地址,时间复杂度为O(1):

Loc(ei) = Loc(e0) + i*c

图b)顺序表的元素外置形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息。也被称为对实际数据的索引,是最简单的索引结构。

三、结构与基本实现

1.结构

顺序表的完整信息包含两部分,一部分是为实现正确操作而需记录的信息,称为顺序表表头区。表头区信息主要包括元素存储区的容量和当前表中已有的元素个数两项。另一部分是表中元素集合。

2.基本实现方式

顺序表的基本实现有一体式结构和分离式结构。

图a)一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。

图b)分离式结构,表对象里只保存与整个表有关的信息(容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。

元素存储区替换:

一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。

分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。

元素存储区扩充:

分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行。人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。

每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。  特点:节省空间,但是扩充操作频繁,操作次数多。

每次扩充容量加倍,如每次扩充增加一倍存储空间。  特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。

四、顺序表的PHP实现

/**

* 顺序表基本操作

* 1.顺序表是否为空 isEmpty

* 2.顺序表是否已满 isFull

* 3.获取某一位置的元素 getItem

* 4.修改某一位置的元素 setItem

* 5.删除某一位置的元素(保序) delItem

* 6.根据值查找元素首次出现位置 getLocation

* 7.统计元素的个数 count

* 8.顺序表末尾插入元素 append

* 9.顺序表任意位置插入元素 add

* 10.输出顺序表 printList

* 11.销毁顺序表 clear

*/

class SeqList

{

/**

* 顺序表默认最大常量

*/

const MAX = 80;

/**

* 顺序表最大容量,默认80

* @var int

*/

private $max;

/**

* 元素个数

* @var int

*/

private $num;

/**

* 具体元素

* @var array

*/

private $item;

/**

* 构造方法

* @param int $max

*/

public function __construct($max = self::MAX)

{

$this->max = $max;

$this->num = 0;

$this->item = new SplFixedArray(self::MAX);

}

/**

* 是否为空

* @return bool

*/

public function isEmpty()

{

return empty($this->num);

}

/**

* 顺序表是否已满

* @return bool

*/

public function isFull()

{

return $this->num >= self::MAX;

}

/**

* 修改某一位置的元素

* @param $index

* @param $value

* @return bool

* @throws Exception

*/

public function setItem($index,$value)

{

try{

if(!is_int($index)){

throw new Exception($index);

}

if(0 <= $index && $index < $this->num){

$this->item[$index] = $value;

}else{

throw new Exception($index);

}

}catch (TypeError $e){

echo $e->getMessage();

}catch (RuntimeException $e){

echo $e->getMessage();

}

return true;

}

/**

* 获取某一位置的元素

* @param $location

* @return mixed

* @throws Exception

*/

public function getItem($index)

{

try{

if(!is_int($index)){

throw new Exception($index);

}

if(0 <= $index && $index < $this->num){

return $this->item[$index];

}else{

throw new Exception($index);

}

}catch (TypeError $e){

echo $e->getMessage();

}catch (RuntimeException $e){

echo $e->getMessage();

}

}

/**

* 删除某一位置的元素

* @param $index

* @throws Exception

*/

public function delItem($index)

{

try{

if(!is_int($index)){

throw new Exception($index);

}

if($index < 0 || $index >= $this->num) {

throw new RuntimeException($index);

}

}catch (TypeError $e){

echo $e->getMessage();

}catch (RuntimeException $e){

echo $e->getMessage();

}

for($i = $index;$i < $this->num;$i++){

$this->item[$i] = $this->item[$i+1];

}

$this->num--;

}

/**

* 根据值查找元素首次出现位置

* @param $value

* @return int|string

*/

public function getLocation($value)

{

for($i = 0;$i < $this->num;$i++){

if($this->item[$i] == $value){

return $i;

}

}

return -1;

}

/**

* 统计元素的个数

* @return int

*/

public function count()

{

return $this->num;

}

/**

* 顺序表末尾插入元素

* @param $value

*/

public function append($value)

{

if($this->isFull()){

echo '表存储已满。';

return;

}else{

$this->item[$this->num] = $value;

$this->num++;

}

}

/**

* 顺序表任意位置插入元素

* @param $index

* @param $value

* @throws Exception

*/

public function add($index,$value)

{

try{

if(!is_int($index)){

throw new Exception($index);

}

if($index < 0 || $index > $this->num) {

throw new RuntimeException($index);

}

}catch (TypeError $e){

echo $e->getMessage();

}catch (RuntimeException $e){

echo $e->getMessage();

}

for($i = $this->num;$i > $index;$i--){

$this->item[$i] = $this->item[$i - 1];

}

$this->item[$index] = $value;

$this->num++;

}

/**

* 输出顺序表

*/

public function printList()

{

for($i = 0;$i < $this->num;$i++){

echo $this->item[$i].'-----';

}

}

/**

* 销毁顺序表

*/

public function clear()

{

$this->__construct();

}

}

$t = new SeqList();

$t->append('er');

$t->add(1,'er2');

var_dump($t->count()).'
';

print_r($t->printList());

//$t->setItem(0,1);

//var_dump($t->getItem(0));

php算法结构,PHP数据结构与算法:顺序表相关推荐

  1. vrp 节约算法 c++_数据结构和算法(Golang实现)(8.1)基础知识-前言

    基础知识 学习数据结构和算法.我们要知道一些基础的知识. 一.什么是算法 算法(英文algorithm)这个词在中文里面博大精深,表示算账的方法,也可以表示运筹帷幄的计谋等.在计算机科技里,它表示什么 ...

  2. 设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

    题目要求:设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性. 代码实现: void Insert(SqList *va,int x) {int i;if( ...

  3. 有序表A和B,其元素均按照从小到大升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列。

    题目要求:有序表A和B,其元素均按照从小到大升序排列,编写一个算法将它们合并成一个顺序表C,要求C的元素也是从小到大的升序排列. 代码实现: void merge(SqList A,SqList B, ...

  4. C语言-数据结构-可变长顺序表的删除操作

    [问题描述] 实现可变长顺序表的删除算法.任务要求:通过顺序表的初始化.插入算法,创建顺序表.根据删除需求,删除指定的顺序表元素. [输入形式] 第一行输入整数N(1<=N<=100),M ...

  5. C语言-数据结构-可变长顺序表的查找操作

    [问题描述] 实现可变长顺序表的查找算法.任务要求:通过顺序表的初始化.插入建立顺序表,根据查找要求,返回查找结果. [输入形式] 第一行输入整数N(1<=N<=100),M(1<= ...

  6. 数据结构之——《顺序表》

    数据结构之--<顺序表> 1.含义 2.分类 3.接口函数实现 4.顺序表的优缺点 1.含义 顺序表示用一段纹理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组 ...

  7. 数据结构之动态顺序表(含游戏菜单)

    上一篇文章我们谈了数据结构的静态顺序表,以及实现了静态顺序表,具体可以看我的上一篇文章->>>数据结构之静态顺序表. 我们可以知道,静态顺序表的缺点是:  因为使用的是定长数组,所以 ...

  8. 数据结构(C语言)顺序表的定义及基本操作

    顺序表的定义及基本操作 一.数据结构:顺序表的定义,创建,基本运算,实现 二.全部代码 定义顺序表 #include<stdio.h> #include<malloc.h> # ...

  9. 【数据结构】【顺序表】 SqList *L与SqList*L的区别

    [数据结构][顺序表] SqList *&L与SqList*L的区别 显然,对于顺序表的抽象数据模型中的函数,其参数使用各不相同. SqList *&L的情况 它的意思是,L是对Lis ...

最新文章

  1. Web服务器的工作原理
  2. 网络发展的模式之一:新功能在应用系统涌现,然后逐渐迁移到基础设施
  3. A Faster Volatile
  4. 《软件构架实践》阅读笔记03
  5. Table还是CSS,请您说说您的见解
  6. LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
  7. winform中textbox属性Multiline=true时全选
  8. springboot内置tomcat,会和Oracle端口冲突,所以需要配置新的端口号
  9. Code[VS]1273 风战
  10. 声波转字符c语言代码,声波传输解码
  11. 【第六届蓝桥杯】奇妙的数字
  12. 20170603学习笔记整理
  13. 手写一个springboot的starter
  14. C# ComboBox:组合框控件
  15. Visio复制的图片在Word中不显示
  16. 30天英语口语训练_笔记
  17. 【Java系列】聊天室开发
  18. 加州伯克利计算机科学录取,【哈鲁2019录取】恭喜哈鲁学员喜提加州伯克利大学计算机科学专业录取!...
  19. Linux命令(常用整理,未完待续)
  20. Random 随机数

热门文章

  1. 开发大型高负载类网站应用的几个要点
  2. freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker
  3. Python必备封装基本代码~Python函数
  4. python扩展库不是用于科学计算的有_有没有可以并行计算的 Python 科学计算库?...
  5. 消防信号总线原理_消防设施操作员关键技能之八:能通过总线式消防联动控制器启动警报等装置...
  6. 普罗米修斯监控linux,Prometheus(普罗米修斯)搭建监控
  7. fatal error C1853 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
  8. LeetCode31.下一个排列 JavaScript
  9. [PHP] 算法-把数组排成最小的数的PHP实现
  10. SSH关于公钥认证Permission denied的问题