遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。

上文说过,物理结构是用于确定数据以何种方式存储的。其他的数据结构(树、图)、算法等基本都是建立在这样一个物理结构之上的,也可以说,物理结构就是数据结构的根本。在这里,我们先介绍两个物理结构,也是我们将来学习数据结构的基石,它们就是顺序表和链表。

顺序表

不扯复杂的定义,不扯什么数学表达式,我们最直观的理解,顺序表就是数组。

是不是非常简单,没错,在 PHP 或者 C 的世界中,我们就把顺序表定义为数组,而相同的名词还包括:顺序存储、顺序结构等。只要看到这种名词,马上想到数组就可以了。当然,在 Java 中,我们也可以将 List 这类的集合当成是顺序存储结构。不过需要注意的是,Java 的 HashMap ,在 PHP 中是以键值对形式定义的数组,它们是哈希表(Hash),从形式上来说,他们并不是顺序的。在这里我们一定要记住,像数组下标递增这样顺序结构的才是顺序存储结构。

顺序表一般占用连续的内存空间。不仅逻辑上,连物理空间上都是相邻连续的。

链表

链表一般在 C 中会定义为一个结构体,其中包括数据和指向下一个链表的指针,它不是顺序的,虽然逻辑是有顺序的(按指针指向),但在物理是可以分开的。也就是说,链表不用占用连续的内存空间,不需要在初始化的时候像数组一样给定长度。

在 PHP 中,我们没有结构体这种语法形式,所以我们直接使用类来表示链表结构。


class Node{
public $data;
public Node $next;
}

这就是一个简单的链表结构,我们可以把它叫做一个“结点”。data 中存放我们要保存的数据,可以是任意类型。而 next 则是我们下一个链表结点。如果我们需要简单的遍历链表,直接不停的调用 next 直到它为空即可。


while($n->next){
$n = $n->next;
echo $n->data, PHP_EOL;
}

上图就是关于链表的逻辑状态以及它的遍历方向。具体的链表操作相关函数我们将在后面的文章中进行讲解。

链表有很多种形式,上面我们定义的是一个简单的单向链表。我们还可以定义双向链表(加一个 prev 指向上一个结点),循环链表(最后一个next指回第一个结点)以及双向循环链表(最后一个next指回第一个结点,第一个的 prev 指向最后一个结点)。关于这些内容,我们也会放到后面的文章中一一讲解。

线性表

了解了顺序表和链表之后,我们最后就来说说线性表。

其实,顺序表和链表这两种物理结构在默认状态下所实现的就是“顺序表”这个逻辑数据结构。

顺序表:由n(n>0)个数据特性相同的元素构成的有限序列(严蔚敏版)

注意几个关键点:

  • 有限:数组长度、链表内存大小

  • 序列:逻辑有序(数组是逻辑和物理都有序,链表是逻辑有序而物理无序)

  • 数据特性相同:PHP 中不明显,C 或 Java 中数组是固定类型的,而且也要给一个初始长度

为什么说线性表这么重要呢?我们想想 MySQL 这样一行一行存储数据的关系型数据库,一张数据表不就是一个线性表吗?特别是我们做 PHP 的程序员,天天都是在和数组(数据库读出来的数据一般都放到数据中)打交道(当然,我们用哈希可能更多些),也就是说,我们在做开发的时候,天天都在接触这个东西,你说它重要不重要。

而 树 和 图 这些数据结构却并不是线性表,在现实的归类中,它们是属于 非线性表 的范畴的。线性表在个很大的特点是只有前后关系,不管是链表还是数组,它们都是遵循着这种前后关系的,但是在 树 和 图 中,除了前后之外,还有上下左右等更复杂的关系。虽说它们的基本表现形式依然是使用数组和链表,但是从严格的角度来说,或者从考试面试的角度来说,它们真的不属于线性结构,而应该划分到 非线性结构 中。

总结

今天这篇文章是学习数据结构中基础的基础。当然,有条件的最好还是看看 C 用结构体是如何定义数组、链表的,PHP 在底层已经帮我们解决了太多问题,所以这些原始的语法结构我们已经用不到了。能够用 C 来学习数据结构是更加推荐的形式。

下一篇文章我们将介绍的是顺序表(数组)的线性表相关逻辑操作。

参考资料:

《数据结构》第二版,严蔚敏

《数据结构》第二版,陈越

《数据结构高分笔记》2020版,天勤考研

===============

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚的更多相关文章

  1. 【数据结构】线性表&&顺序表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺 ...

  2. 数据结构之动态顺序表(C实现)

    线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...

  3. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  4. 数据结构(C++)——顺序表

    顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...

  5. C语言 线性表 顺序表结构 实现

    一个能够自动扩容的顺序表 ArrList (GCC编译). #include <stdio.h> #include <stdlib.h> #include <string ...

  6. C++ 数据结构学习一(顺序表)

    //SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...

  7. C++数据结构学习之顺序表

    顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...

  8. 数据结构——Java实现顺序表

    一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...

  9. JAVA实现具有迭代器的线性表(顺序表)

    1,先了解下JAVA类库中的迭代器:JAVA提供了两种基本类型的迭代器,分别用两个接口来表示:Iterator<T>,ListIterator<T>.其中,Iterator&l ...

  10. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

随机推荐

  1. Longhorn 云原生分布式块存储解决方案设计架构和概念

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? 目录 1. 设计 1.1. Longhorn Manager 和 Longhorn Engine 1.2 ...

  2. 【笔记】scikit-learn中的Scaler(归一化)

    scikit-learn中的数据归一化 在机器学习使用数据归一化的时候有一个重要的注意事项 我们对训练数据进行均值和方差的处理,得到mean_train以及std_train,但是在对测试数据进行归一 ...

  3. Redis雪崩和Redis穿透

    Redis雪崩:查询时Redis没有数据 本来先从Redis里面查某个数据 但是Redis中这个数据刚好被删除了,还没来得及更新 一瞬间很多请求直接进入了Mysql进行查询 而mysql承受不了太大压 ...

  4. Java面试常见基础问题

    1.equals和==有什么区别? ==比较两个对象在内存里是不是同一个对象,就是说在内存里的存储位置一致. 如:两个String对象存储的值是一样的,但是可能在内存里存储在不同的地方. equals ...

  5. C# 插件编写

    //加载插件 private void LoadPlugins() { string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExe ...

  6. C#基础知识---装箱与拆箱

    一.定义 装箱:将值类型转化为引用类型,装箱一般会在堆上分配一块内存,用于存储要转换的值. 拆箱:将引用类型转化为值类型 注:.NET 2.0 引入的泛型其实在很大的程度上解决了装拆箱产生的类型转换问 ...

  7. 十一:JavaWeb中的监听器(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  8. hive表导出到mysql报错

    Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject hadoop@hado ...

  9. JDBC中的元数据——2.参数元数据

    package metadata; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.Pre ...

  10. 类的基础语法阅读【Python3.8官网文档】

    英文官方文档: https://docs.python.org/3.8/tutorial/classes.html 中文官方文档: https://docs.python.org/zh-cn/3.8/ ...