不用想得太繁芜,我们只须要这几个大略的操作就可以了:
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版,天勤考研