绍兴网站建设seo,建站管理后台,企业网站建设价格表,网站建设方面存在的问题目录
一.顺序表的概念
二.顺序表的实现
新增元素
默认尾部新增
指定位置添加元素
查找元素
查找是否存在
查找元素对应的位置
查找指定位置对应的元素
删除元素
获取顺序表长度
清空顺序表 一.顺序表的概念
在线性数据结构中#xff0c;我们一般分为俩类#xf… 目录
一.顺序表的概念
二.顺序表的实现
新增元素
默认尾部新增
指定位置添加元素
查找元素
查找是否存在
查找元素对应的位置
查找指定位置对应的元素
删除元素
获取顺序表长度
清空顺序表 一.顺序表的概念
在线性数据结构中我们一般分为俩类顺序表和链表 顺序表是一种线性数据结构是数据元素按照线性顺序存储的数据结构通常使用数组实现。顺序表中的元素以一定的顺序排列每个元素都可以通过下标来进行访问。顺序表支持随机访问可以快速地访问任意一个元素但插入或删除元素时需要移动其余元素效率较低。顺序表在内存中是一个连续的存储区域数据元素紧密相邻存储因此随机访问速度快。由于顺序表容量固定当元素数量超过容量时需要重新分配内存空间这可能会导致操作的耗时和内存使用的增加。
二.顺序表的实现
顺序表是一种数据结构他和语言语法无关语言只是通过不同的方式去描述这个数据结构 举个通俗的例子说假如湖面上有一座假山而湖边有一群游客 有的人用英语说 “There is a rockery on the lake” 有的人用中文说 “湖面上有一坐假山” 有的人用日语说 “湖面に築山があります” 而这座假山就像是我们的数据结构而我们使用的英语中文日语则是我们不同的编程语言。因此在学习数据结构的过程中我们不必刻意去在意使用的什么语言什么语法我们需要了解的是这个数据结构的本质和功能以及特性。笔者这里以Java作为顺序表的载体进行分享。
我们通常使用数值去实现顺序表对于一个顺序表它至少应该有以下俩个成员变量
数组用来存放数据和元素数组内存放的元素的个数记录数组内元素的个数可以方便我们更好的进行增加删除等操作
public class MyArrayList{public int[] arr;//存放数据的数组public int usedSize;//记录数组内元素的个数
}
对于一个顺序表它应该实现以下这些功能我们将这些顺序表特有的功能和特性抽象出来一个接口然后自己用代码去实现一个正真的顺序表。
public interface Ilist {// 新增元素,默认在数组最后新增public void add(int data);// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind);// 查找某个元素对应的位置public int indexOf(int toFind);// 获取 pos 位置的元素public int get(int pos);// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);// 删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size();// 清空顺序表public void clear();
}
新增元素
我们将新增元素分为俩种方式默认尾部新增元素以及指定位置新增元素
默认尾部新增
在刚开始的时候数组大小为我们设置的默认大小5数组内部是没有元素的也就是说默认的元素数量也是0我们可以直接新增元素但是数组的内容是有限的当数组内容放满了后就需要扩容了我们使用copyOf直接将原有数组的大小扩大一倍再让这个数组重新接收扩容后的数组。
再来到具体的新增元素部分usedSize相当于一直在记录顺序表最后一个元素直接对当前顺序表最后一个位置放入数据data并且记录元素的数量加一。
public static final int DEFAULT_SIZE 5;// 新增元素,默认在数组最后新增public void add(int data) {//判断满了之后要扩容if (arr.length usedSize) {arr Arrays.copyOf(arr, DEFAULT_SIZE * 2);}arr[usedSize] data;usedSize;}
指定位置添加元素
在添加之前先对要添加的位置进行判断在顺序表中除了第一个节点之外每一个节点都有它的前驱所以我们要确保添加的位置在序列中如果不在序列中我们就抛出一个自定义异常这一步不是必须的
在确定了输入的位置是合法的后还要先判断顺序表是否已满如果满了就进行扩容在剩余空间充足的情况下就进行添加操作在添加的时候需要进行元素的移动来为新的元素腾出位置之后再在空出的位置上放入我们想要放入的元素当我们完成新增后记录元素个数的usedSize自然也要加一
、
代码实现 private void cheakPos(int pos) {if (pos 0 || pos usedSize)throw new ExceptionOfPos(pos位置不能为 pos);} public void add(int pos, int data) {cheakPos(pos);//判断满了之后要扩容if (arr.length usedSize) {arr Arrays.copyOf(arr, DEFAULT_SIZE * 2);}//移动元素留出空位for (int i usedSize - 1; i pos; i--) {arr[i 1] arr[i];}arr[pos] arr[pos - 1];//给pos位置元素赋值arr[pos - 1] data;usedSize;}
public class ExceptionOfPos extends RuntimeException{public ExceptionOfPos(String message) {super(message);}
}查找元素
查找可以按查找结果分为
查找是否存在查找元素对应的位置查找指定位置对应的元素
查找是否存在
查找是相当最好实现的因为我们并没有对顺序表进行内容上的改变这也是顺序表最大的优势。查找只需要挨个遍历看看是否有我们要找的元素如果有就返回存在(true)如果没有就返回不存在(false) // 判定是否包含某个元素public boolean contains(int toFind) {for (int i 0; i usedSize; i) {if (arr[i] toFind)return true;}return false;}
查找元素对应的位置
挨个遍历看看是否有我们要找的元素如果有就返回元素的下标如果没有就返回-1 // 查找某个元素对应的位置public int indexOf(int toFind) {for (int i 0; i usedSize; i) {if (arr[i] toFind)return i 1;}return -1;}
查找指定位置对应的元素
在判定输入位置和顺序表的合法性后不一定非要抛出异常笔者这里只是给个思路直接返回目标位置的元素就可以了 // 获取 pos 位置的元素public int get(int pos) {//检查输入位置是否合法cheakPos(pos);//检查顺序表是否为空cheakEmpty();return arr[pos];}private void cheakPos(int pos) {if (pos 0 || pos usedSize)throw new ExceptionOfPos(pos位置不能为 pos);}private void cheakEmpty() {if (usedSize 0)throw new ExceptionOfEmpty(当前顺序表为空无法操作);}
删除元素
删除之前得先判断顺序表是否为空在不为空的情况下我们利用刚才写的查找方法indexOf找到要删除的元素的位置然后将元素从后往前依次覆盖就可以了因为最后一个元素的后面是没有元素的所以我们要进行手动覆盖元素减少之后对应的记录数量的usedSize也得减一 //删除第一次出现的关键字keypublic void remove(int toRemove) {//检查顺序表是否为空cheakEmpty();int delPos indexOf(toRemove);for (int i delPos; i usedSize; i) {arr[i-1] arr[i];}arr[usedSize-1] arr[usedSize];usedSize--;}
获取顺序表长度
因为usedSize保存了顺序表元素的个数也就是顺序表的长度所以在判断顺序表非空后直接返回usedSize就可以 // 获取顺序表长度public int size() {//检查顺序表是否为空cheakEmpty();return usedSize;}
清空顺序表
直接将元素的个数置为0其余的方法就无法通过usedSize去操作顺序表了也就完成了顺序表的清空 // 清空顺序表public void clear() {usedSize 0;} 本次的分享就到此为止了希望我的分享能给您带来帮助也欢迎大家三连支持你们的点赞就是博主更新最大的动力如有不同意见欢迎评论区积极讨论交流让我们一起学习进步有相关问题也可以私信博主评论区和私信都会认真查看的我们下次再见