一 图解顺序表
顺序表的概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。(以下我们所要进行描述的是动态顺序表,动态为数据分配一个内存空间)
顺序表的实现
在Java类与对象中,我们了解到。java是一门面向对象的编程语言,对于如何对一组数据进行增删查改。我们可以把他们放到一个类里面,通过实例化对象。直接进行相应的调用操作即可,不用过多的关心类里面是怎么实现的。对于一个动态顺序表,我们可以定义一个数组来存储这些数据,用useside来表示数组里面实际的有效数据的长度,这样我们就可以得到类的成员属性,通过对应的方法来实现。接下来我们通过图片以及代码结合,理解一下什么是顺序表。
1 抽象对应的类
class ordly { public int[] elem; public int useside;//表示数据的有效长度 public ordly(){ this.elem=new int[6]; } }
2 类的方法去实现顺序表
对于类的调用者来说就是提供了相应的接口去实现
2.1 顺序表的打印
// 打印顺序表(代码实现) public void display() { for (int i = 0; i < useside; i++) { System.out.println(elem[i]+" "); } }
2.2 顺序表的新增元素
// 在 pos 位置新增元素(代码实现) public boolean isfull(){ return this.useside==elem.length; } public void add(int pos, int data) { if (pos<0||pos>useside){ System.out.println("输入pos位置不合法"); return; } if (isfull()){//判断是否需要扩容 elem= Arrays.copyOf(elem,2*elem.length); } for (int i=useside-1;i>=pos;i--){ elem[i+1]=elem[i]; } elem[pos]=data; useside++; }
2.3判定是否包含某个元素
// 判定是否包含某个元素(代码实现) public boolean contains(int toFind) { if(useside==0){ System.out.println("这是一个空顺序表"); return false; } for (int i = 0; i < useside; i++) { if (elem[i]==toFind){ return true; } } return false;//循环走完还没找到,说明没有这个数据 }
2.4 获取顺序表的长度
// 获取顺序表长度 public int size() { return useside; }
2.5 查找某个元素对应的位置
方法与是否包含一个数的方法类似
// 查找某个元素对应的位置(代码实现) public int search(int toFind) { if (useside==0){ System.out.println("空顺序表,没有你所要找的数据"); } for (int i = 0; i < useside; i++) { if (elem[i]==toFind){ return i; } } return -1;//没有找到 }
2.6 获取pos位置的元素
// 获取 pos 位置的元素(代码实现) public int getPos(int pos) { if (pos<0||pos>useside){ System.out.println("输入位置不合法"); return -1; } if (useside==0){ System.out.println("这是一个空顺序表"); return -2; } return elem[pos]; }
2.8 把pos位置改成value
// 给 pos 位置的元素设为 value public void setPos(int pos, int value) { if (pos<0||pos>useside){ System.out.println("输入位置不合法"); return; } if (useside==0){ System.out.println("这是一个空链表"); return; } elem[pos]=value; }
2.9 删除第一次出现的关键字key
//删除第一次出现的关键字key public void remove(int toRemove) { if (useside==0){ System.out.println("这是一个空顺序表,没有你要删除的数据"); return; } int index=search(toRemove); if (index==-1){ System.out.println("没有你要删除的元素"); } for (int i = index; i <useside-1 ; i++) { elem[i]=elem[i+1]; } useside--; }
2.10 清空顺序表
public void clear() { useside=0; }
这里要特别提及一下这里的清空顺序表以及删除某个元素的顺序表的操作针对的简单类型,对于引用类型。我们不是这样做的,对于这一块的源码,以及对于引用操作类型的处理,可以参考我码云上的代码,希望对你有所帮助。
顺序表缺陷
1 对于顺序表的插入以及删除,复杂度为O(N)。
2 对于扩容处理,拷贝数组,释放旧空间,会有不小的消耗
3 对于扩容处理,还存在在浪费空间
缺陷的解决:引进链表,解决这一问题。
图解顺序表+单链表-2