当前位置: 首页 > 后端技术 > PHP

我理解的数据结构(一)——数组(Array)

时间:2023-03-30 05:18:17 PHP

我理解的数据结构(一)——数组(Array)首先,我是一个phper,但毕竟php是一种脚本语言,如果你使用脚本语言理解数据结构有一定的局限性。因为脚本语言不需要编译,如果你的语法写得好,可能比使用更好的数据结构(在数据量小的情况下)执行得更快、更高效。并且数据结构不存在任何语言。所以下面会选择java来更深入的理解数据结构。注意:java的语法这里就不过多解释了。1、定义数组的两种方式int[]arr=newint[10];int[]arr=newint[]{10,20,30};2.数组的基本数组的容量是在数组开头定义的时间是固定的。数组最大的优点:基于索引的快速查询。如:arr[2]。当“索引有意义”时最好使用数组。但并不是所有的语义索引都适合数组:比如索引是一个人的身份证号,会占用太多空间,不现实。下面将讨论数组“索引没有语义”的情况。基于java数组,二次封装属于我们自己的数组类,对数组的理解更深。3.创建最基本的数组类学习任何数据结构,增删改查是必不可少的。接下来让我们一步步完善自己的数组的增删改查查询publicclassArray{//数组的实际大小privateintsize;//数组privateint[]data;//构造函数,根据传入的容量定义一个int类型的数组publicArray(intcapacity){data=newint[capacity];大小=0;}//重载,没有传入容量,定义一个长度为10的int类型数组publicArray(){this(10);}//数组的实际大小publicintgetSize(){returnsize;}//数组的容量publicintgetCapacity(){returndata.length;}//数组是否为空publicbooleanisEmpty(){returnsize==0;}}4.Add//插入数组的任意位置publicvoidadd(intindex,intele){//数组已满if(size==data.length){thrownewIllegalArgumentException("addfailed.arris满的”);}//插入的索引位无效if(index<0||index>=size){thrownewIllegalArgumentException("addfailed.index<0orindex>=size");}//从索引向后的所有元素都向后赋值for(inti=size-1;i>=index;i--){data[i+1]=data[i];}数据[索引]=ele;size++;}//插入第一个位置publicvoidaddFirst(intele){add(0,ele);}//插入最后一个位置publicvoidaddLast(intele){add(size,ele);}五、检查并修改//查询索引索引处的元素publicintget(intindex){if(index<0||index>=size){thrownewIllegalArgumentException("getfailed.indexisillegal");}returndata[index];}//查询ele元素的索引,如果没有return-1publicintfind(intele){for(inti=0;i=size){thrownewIllegalArgumentException("getfailed.indexisillegal");}data[index]=ele;}6.Delete//根据index删除数组中第一个ele,returnelepublicintremove(intindex){if(index<0||index>=size){thrownewIllegalArgumentException("删除失败。索引是非法的");}for(inti=index+1;i{//数组的实际大小privateintsize;//数组privateE[]data;//构造函数,根据传入的容量定义一个E类型的数组publicArrayNew(intcapacity){//forceddata=(E[])newObject[capacity];大小=0;}//重载,不传入容量,定义一个长度为10的int类型数组publicArrayNew(){this(10);}//数组的实际大小publicintgetSize(){returnsize;}//数组的容量QuantitypublicintgetCapacity(){returndata.length;}//数组是否为空publicbooleanisEmpty(){returnsize==0;}//插入数组中的任意位置publicvoidadd(intindex,Eele){//数组已满if(size==data.length){thrownewIllegalArgumentException("addfailed.arrisfull");}//插入的索引无效if(index<0||index>size){thrownewIllegalArgumentException("addfailed.index<0orindex>size");}//所有从index向后的元素都向后赋值for(inti=size-1;i>=index;i--){data[i+1]=data[i];}data[index]=ele;size++;}//在第一个位置插入publicvoidaddFirst(Eele){add(0,ele);}//在最后一个位置插入publicvoidaddLast(Eele){add(size,ele);}//查询索引索引处的元素publicEget(intindex){if(index<0||index>=size){thrownewIllegalArgumentException("getfailed.indexisillegal");}returndata[index];}//查询ele元素的索引,不存在则返回-1publicintfind(Eele){for(inti=0;i=size){thrownewIllegalArgumentException("getfailed.indexisilegal");}data[index]=ele;}//根据索引删除数组中第一个ele并返回elepublicEremove(intindex){if(index<0||index>=size){thrownewIllegalArgumentException("删除失败。索引是非法的");}Eresult=data[index];for(inti=index+1;iarr=newArrayNew<>(20);数组原理:其实动态数组的原理很简单。如果我们想让我们的数组具有可伸缩性,那么只需要在添加或删除元素时判断大小是否达到临界点即可。然后创建一个新的容量数组,然后将旧数组的引用指向新数组。因此,我们上面的代码改动很小,只需要改动add和remove。然后添加一个调整大小的方法。//在数组的任意位置插入publicvoidadd(intindex,Eele){//插入的索引位无效if(index<0||index>size){thrownewIllegalArgumentException("addfailed.index<0or索引>大小");}//ifsize==data.length,数组长度已满if(size==data.length){resize(data.length*2);}//everythingfromindexbackward所有元素都向后赋值for(inti=size-1;i>=index;i--){data[i+1]=data[i];}数据[索引]=ele;size++;}//根据Index移除数组中第一个ele,returnelepublicEremove(intindex){if(index<0||index>=size){thrownewIllegalArgumentException("removefailed.indexisillegal");}E结果=数据[索引];对于(inti=index+1;i=size){thrownewIllegalArgumentException("removefailed.indexis非法的”);}E结果=数据[索引];for(inti=index+1;i