【PHP数据结构】顺序表(数组)的相关逻辑操作
在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作。在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组。那么针对数组,我们通常都会有哪些操作呢?
不用想得太复杂,我们只需要这几个简单的操作就可以了:
1.查找
2.插入
3.删除
是不是很简单?为什么没有遍历呢?我们经常要去遍历一个数组呀?
请注意,在这里,我们是以数据结构的角度来讲顺序表这个物理结构。遍历操作一般针对的会是更复杂的一些结构,比如树、图,从一个结点开始去遍历所有的路径之类的。而对于顺序表这个物理结构来说来说,我们只需要掌握上述那三个操作,不需要包含遍历。
又有同学说了,在 PHP 中,这三个操作简直太简单好不好,完全没有技术含量呀!
小心不要入坑了哦,查找我们说的是找到这个值所在的下标,而不是给你一个下标简单的输出一个值。另外,插入和删除我们是需要考虑一个问题的,那就是我们第 i 个位置插入或者删除数据之后,i+1 及其之后的数据是不是也要相应的移动呢?要小心,我们是插入和删除一个下标位置的内容,而不是修改替换这个下标的内容!!!
好吧,还是直接以实例来说明。
插入
/**
* 数组插入
* @param array $list 顺序表数组
* @param int $i 插入数据下标
* @param mixed $e 数组元素
* return bool 成功失败结果
*/
function ListInsert(array &$list, int $i, $e)
{
$c = count($list);
if ($i < 0 || $i > $c) {
return false;
}
$j = $c - 1;
while ($j >= $i) {
// 从后往前,下一个位置的值变成现在这个位置的值
// 数据向后挪动
$list[$j + 1] = $list[$j];
$j--;
}
// 在指定位置插入值
$list[$i] = $e;
return true;
}
插入操作首先要判断是否下标越界。接下来就从后往前地将插入位置之后的数据向后挪动一位,最后将新增加的数据放到指定的位置。需要注意的是,在这个操作中,我们最主要关心的就是这个数据位置的移动。我们为什么要从数组最后一位开始进行挪动,而不是从插入位置开始移动呢?如果从插入位置开始,那么后面的数据就会都是一个数据了,也就是插入位置的下一个数据。大家有兴趣的可以自己尝试一下。
$arr = [1, 2, 3, 4, 5, 6, 7];
ListInsert($arr, 3, 55);
print_r($arr);
// Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => 55
// [4] => 4
// [5] => 5
// [6] => 6
// [7] => 7
// )
在上面的测试代码中,我们往数据的位置 3 处插入一个数据 55 。可以看到输出的结果,数组长度增加了一位,并且从下标 3 的位置开始,后面的数据都向后移动了一位。
删除
/**
* 删除指定下标元素
* @param array $list 顺序表数组
* @param int $i 插入数据下标
* return bool 成功失败结果
*/
function ListDelete(array &$list, int $i)
{
$c = count($list);
if ($i < 0 || $i > $c - 1) {
return false;
}
$j = $i;
while ($j < $c) {
// 当前位置的值变成下一个位置的值
// 数据向前挪动
$list[$j] = $list[$j+1];
$j++;
}
// 去掉最后一个数据
unset($list[$c - 1]);
return true;
}
学习了上面的插入操作之后,相信大部分同学也能想象到删除元素的操作正好跟插入是返过来的。第一步依然还是判断下标是否合规。接下来就是把指定删除的下标元素之后的元素向前挪动一位。在这里,我们是从删除下标开始将元素依次向前移动一位,最后再删除掉重复的最后一位数据,也就是实现数组元素数量的减 1 操作。
$arr = [1, 2, 3, 4, 5, 6, 7];
ListDelete($arr, 5);
print_r($arr);
// Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => 4
// [4] => 5
// [5] => 7
// )
测试结果也很清楚,原来在下标 5 位置的元素是 6 。我们删除了下标为 5 的元素后,整个数据的元素数量减少了一位,后面的元素要移动上来,也就是元素 7 要移动到 5 的位置上来。
查找
查找就是简单的做一个线性查找即可,也就是一个一个的去比对数据,看我们需要的数据在数组的哪个位置。
/**
* 查找
* @param array $list 顺序表数组
* @param mixed $e 数组元素
* return int 查找结果下标
*/
function LocateElem(array $list, $e)
{
$c = count($list);
for ($i = 0; $i < $c; $i++) {
if ($list[$i] == $e) {
return $i;
}
}
return -1;
}
如果找到了数据,我们就返回当前数据所在位置的下标。如果到最后依然没有找到对应的数据,就返回一个 -1 表示我们没有找到对应的数据。
总结
欢迎进入数据结构与算法的世界,意不意外,惊不惊喜,今天第一次写这么多代码,但是写出来的是不是感觉和我们平常写的不太一样?就像插入和删除的数据移动一样,如果平常没注意的话可能还真的不知道我们应该反过来移动才能得到正确的结果。这就是数据结构和算法学习的乐趣,挑战自己,每一天都是超越!
测试代码:
参考资料:
《数据结构》第二版,严蔚敏
《数据结构》第二版,陈越
《数据结构高分笔记》2020版,天勤考研
【PHP数据结构】顺序表(数组)的相关逻辑操作的更多相关文章
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- hrbust-1545-基础数据结构——顺序表(2)
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- 数据结构---顺序表(C++)
顺序表 是用一段地址连续的存储单元依次存储线性表的数据元素. 通常用一维数组来实现 基本操作: 初始化 销毁 求长 按位查找 按值查找 插入元素 删除位置i的元素 判空操作 遍历操作 示例代码: // ...
- 数据结构顺序表Java实现
Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...
- python算法与数据结构-顺序表(37)
1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...
- Java数据结构——顺序表
一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
- 数据结构——顺序表(sequence list)
/* sequenceList.c */ /* 顺序表 */ /* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表. */ #in ...
- 数据结构顺序表中Sqlist *L,&L,Sqlist *&L
//定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...
随机推荐
- Linux中的DNS的正解析
目录 一.DNS概述 1.1.DNS定义 1.2.域名结构 1.3.DNS域名解析的方式 1.4.DNS服务器类型 1.5.BIND服务 BIND服务器端程序 二.构建DNS域名正向解析步骤 一.DN ...
- 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!
一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ...
- Xilinx约束学习笔记(一)—— 约束方法学
<Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...
- NOIP 模拟 $11\; \rm english$
题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...
- SpringBoot快速入门(二)
2.SpringBoot原理分析 2.1.SpringBoot自动配置 Condition Condition 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Be ...
- 《深入浅出vue.js》阅读笔记之数组变化侦测
1.如何追踪变化 数组的侦测方式和对象不同,比如: this.list.push(1) 此时并不会像改变对象一样触发setter. 同理,要侦测数组的变化意味着我们在改变数组的时候得到通知,如图,我们 ...
- .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量. 1)内存中的位置:静态存储区 2)初始化:局部的静态变量只能被初始化一次, ...
- 输入npm install 报错node-sass@4.13.0 postinstall:`node scripts/build.js` Failed at the node-sass@4.13.0
这个是因为sass安装时获取源的问题,先修改sass安装的源,再运行npm install就成功了 npm config set sass_binary_site=https://npm.taobao ...
- java Date操作的相关代码
/** * 获取现在时间,这个好用 * * @return返回长时间格式 yyyy-MM-dd HH:mm:ss */ public static Date getSqlDate() { Date s ...
- 华为oj-判断输入的字符串是不是一个有效的IP地址
题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 ...