在定义好了物理构造,也就是存储构造之后,咱们就须要对这个存储构造进行一系列的逻辑操作。在这里,咱们就从程序表动手,因为这个构造非常简单,就是咱们最罕用的数组。那么针对数组,咱们通常都会有哪些操作呢?
不必想得太简单,咱们只须要这几个简略的操作就能够了:
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 示意咱们没有找到对应的数据。
总结
欢送进入数据结构与算法的世界,意不意外,惊不惊喜,明天第一次写这么多代码,然而写进去的是不是感觉和咱们平时写的不太一样?就像插入和删除的数据挪动一样,如果平时没留神的话可能还真的不晓得咱们应该反过来挪动能力失去正确的后果。这就是数据结构和算法学习的乐趣,挑战本人,每一天都是超过!
测试代码:
https://github.com/zhangyue0503/Data-structure-and-algorithm/blob/master/2. 线性表 /source/2.2%20 程序表(数组)的相干逻辑操作.php
参考资料:
《数据结构》第二版,严蔚敏
《数据结构》第二版,陈越
《数据结构高分笔记》2020 版,天勤考研
各自媒体平台均可搜寻【硬核项目经理】