0

0

数据结构 - 线性表学习(php模拟)

php中文网

php中文网

发布时间:2016-06-13 12:29:19

|

888人浏览过

|

来源于php中文网

原创

数据结构 --- 线性表学习(php模拟)

线性表:零个或多个数据元素的有限序列(注:以下都是用的整型数据模拟)

一 顺序存储结构(用一段地址连续的存储单元一次存储线性表的数据元素)
  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           */        public function __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           */        public function get_elem($i)        {            if($this->num == 0 || $i < 1 || $i > $this->num) //判断查找是否合理                return false;            return $this->arr[$i-1];    //返回数据,时间复杂度O(1)        }        /**          * 插入元素(顺序结构中,插入元素后,后面所有的数据都要后移,平均时间复杂度O(1)):          * 如果插入位置不合理,失败          * 如果线性长度大于数组长度,则返回错误或者动态增加容量          * 从最后一个元素开始向前遍历到第i个位置,分别将它们向后移动一个位置          * 将元素插入i位置          * @param Int $i 需要插入到第几个元素          * @param Int $elem 插入的节点          * @return bool          */        public function insert_elem($i,  $elem)        {            if($this->num == $this->len) //顺序线性表已满                return false;            if($i < 1 || $i > ($this->num+1)) //i不在范围之内                return false;            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;            return true;        }        /**          * 删除元素(顺序结构中,插入元素后,后面所有的数据都要前移,平均时间复杂度O(1)):          * 如果删除位置不合理,失败          * 将元素删除          * 从最后删除元素开始向后遍历到最后,分别将它们向前移动一个位置          * @param Int $i 需要仓储的第几个元素          * @return bool          */        public function delete_elem($i)        {            if($this->num == 0) //线性表为空                return false;            if($i < 1 || $i > $this->num) //删除位置不正确                return false;            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;            return true;        }        /**          * 获取顺序表          * @return           */            public function get_arr()        {            return $this->arr;        }        /**          * 获取长度          * @return           */            public function get_len()        {           return array('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());
输出:
boolean
truearray (size=5) 0 => int 1 1 => int 4 2 => int 8 3 => int 7 4 => int 5array (size=2) 'num' => int 5 'len' => int 10boolean truearray (size=4) 0 => int 4 1 => int 8 2 => int 7 3 => int 5array (size=2) 'num' => int 4 'len' => int 10

 

PHP与MySQL程序设计3
PHP与MySQL程序设计3

本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。

下载

立即学习PHP免费学习笔记(深入)”;

 

立即学习PHP免费学习笔记(深入)”;

二 链表存储结构(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           */        public function __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           */        public function get_elem($i)        {            if($i < 1 || $i > $this->arr[0]['data'])                 return false;            $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          */        public function insert_elem($i, $elem)        {            $len = $this->arr[0]['data'] + 1;            if($i < 1 || $i > $len)                 return false;            $j = $this->malloc(); //获取空闲下标            if(!$j)                return false;            $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'];            return true;        }        /**          * 删除元素:          * 初始化$j从1开始          * 当$j<$i,遍历链表          * 将i位置删除          * @param Int $i 需要删除第几个元素          * @return bool          */        public function delete_elem($i)        {            $len = $this->arr[0]['data'];            if($i < 1 || $i > $len)                 return false;                        $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'];            return true;        }        /**          * 获取空闲的结点下标,也就是相当于申请一个空结点          * @return           */        private function malloc()        {            if(empty($this->space_arr))                return false;            return array_pop($this->space_arr);        }        /**          * 释放结点          * @param Int $cur 需要回收的结点下标          */        private function free($cur)        {            array_push($this->space_arr, $cur);        }        /**          * 打印          * @return           */            public function 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           */            public function get_len()        {           return array('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());                输出:        boolean true        boolean true        boolean true        boolean true        6 5        array (size=2)          'num' => int 2          'len' => int 10           

 

立即学习PHP免费学习笔记(深入)”;

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

0

2026.02.04

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

0

2026.02.04

Golang 容器化与 Docker 实战
Golang 容器化与 Docker 实战

本专题深入讲解 Golang 应用的容器化与 Docker 部署,涵盖 Docker 基础概念、容器构建与镜像管理、Go 应用的 Dockerfile 编写、跨平台容器部署与优化、Docker Compose 和 Kubernetes 部署工具。通过实际案例,帮助学习者掌握 如何将 Golang 应用容器化并实现高效部署与管理,提升系统的可扩展性与运维效率。

1

2026.02.04

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

104

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

49

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

9

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

76

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

456

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JavaScript高级框架设计视频教程
JavaScript高级框架设计视频教程

共22课时 | 3.6万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.3万人学习

CSS3实现按钮特效视频教程
CSS3实现按钮特效视频教程

共15课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号