定义好物理结构,即存储结构后,我们需要对存储结构进行一系列的逻辑操作。这里,我们先从序列表说起,因为这个结构非常简单,是我们最常用的数组。那么对于数组,我们通常有哪些操作呢?不要想的太复杂,我们只需要这些简单的操作:1.查找2.插入3.删除容易吗?为什么没有遍历?我们经常要遍历一个数组?请注意,这里,我们是从数据结构的角度来谈时序表的物理结构。遍历操作一般针对比较复杂的结构,比如树,图,从一个节点开始遍历所有路径等等。对于序列表的物理结构,我们只需要掌握以上三个操作即可,不需要包括遍历。另一个同学说,在PHP中,这三个操作简直太简单了,好吧,一点技术含量都没有!小心不要落入陷阱。我们说的搜索的意思是找到这个值所在的下标,而不是简单的给你输出一个有下标的值。另外,我们在插入和删除的时候需要考虑一个问题,就是我们在第i个位置插入或者删除数据之后,第i+1以及之后的数据是否也应该随之移动呢?注意,我们是插入和删除一个下标位置的内容,而不是修改和替换这个下标的内容!!!好吧,还是直接举例说明吧。Insert/***数组插入*@paramarray$list序列表数组*@paramint$i插入数据下标*@parammixed$e数组元素*returnbool成功或失败结果*/functionListInsert(array&$list,int$i,$e){$c=count($list);如果($i<0||$i>$c){返回假;}$j=$c-1;while($j>=$i){//从后往前,下一个位置的值变成当前位置的值//数据向后移动$list[$j+1]=$list[$j];$j--;}//在指定位置插入一个值$list[$i]=$e;returntrue;}插入操作首先要判断下标是否越界。接下来将插入位置之后的数据从后向前移动一位,最后将新添加的数据放到指定位置。需要注意的是,在这个操作中,我们主要关注的是数据位置的移动。为什么我们从数组的最后一位开始移动,而不是从插入位置开始?如果是从插入位置开始,那么后面的数据都是一个数据,即插入位置的下一个数据。如果你有兴趣,你可以自己尝试一下。$arr=[1,2,3,4,5,6,7];ListInsert($arr,3,55);print_r($arr);//数组//(//[0]=>1//[1]=>2//[2]=>3//[3]=>55//[4]=>4//[5]=>5//[6]=>6//[7]=>7//)在上面的测试代码中,我们在数据的位置3插入了一个数据55。可以看到输出结果,数组的长度增加一位,并且从下标3的位置开始,后面的数据往后移动一位。delete/***删除指定下标元素*@paramarray$list序列表数组*@paramint$i插入数据下标*returnbool成功或失败结果*/functionListDelete(array&$list,int$i){$c=计数($列表);如果($i<0||$i>$c-1){返回假;}$j=$i;while($j<$c){//当前位置的值变成下一个位置的值//向前移动数据$list[$j]=$list[$j+1];$j++;}//删除最后一个数据unset($list[$c-1]);returntrue;}学习完上面的插入操作,相信大部分同学也能想象到删除元素的操作和插入是一模一样的。第一步依旧是判断下标是否合规。下一步是将指定删除的下标元素之后的元素向前移动一位。这里我们从删除下标开始,将元素一个一个向前移动,最后删除重复的最后一位数据,即实现数组元素个数减1的操作。$arr=[1,2,3,4,5,6,7];ListDelete($arr,5);print_r($arr);//数组//(//[0]=>1//[1]=>2//[2]=>3//[3]=>4//[4]=>5//[5]=>7//)测试结果也很清楚,原来下标5位置的元素是6,我们删除下标5的元素后,整个数据的元素个数减少了一个,接下来的元素必须向上移动,也就是元素7必须移动到5的位置。查找简单来说就是做线性查找,也就是一个一个比较数据,看我们需要的数据在数组中的什么位置。/***Find*@paramarray$list序列列表数组*@parammixed$e数组元素*returnint搜索结果下标*/functionLocateElem(array$list,$e){$c=count($list);对于($i=0;$i<$c;$i++){如果($list[$i]==$e){返回$i;}}return-1;}如果找到数据,我们将返回当前数据所在的下标。如果最后还是没有找到对应的数据,则返回一个-1,表示我们没有找到对应的数据。总结欢迎来到数据结构和算法的世界。你是惊讶还是意外?今天是第一次写这么多代码,但是感觉和我们平时写的不一样吗?就像插入和删除的数据移动一样,如果你不注意,你可能真的不知道我们应该反向移动才能得到正确的结果。这就是数据结构和算法学习的乐趣,挑战自我,超越每一天!测试代码:https://github.com/zhangyue0503/Data-structure-and-algorithm/blob/master/2.线性表/source/2.2%20序列表(数组)的相关逻辑操作.php参考资料:《数据结构》第二版颜伟民《数据结构》第二版陈越《数据结构高分笔记》2020版天琴考研各自媒体平台均可搜索【硬核项目经理】
