数据结构与算法之数组
数组
数组是数据呈线性排列的一种数据结构,在数组中,访问数据十分简单,而添加和删除数据比较耗费功夫


a是数组的名字,后面的"[]"中的数字表示该数据是数组中的第几个数据(这个数字叫做“数组下标”,下标从0开始计数),比如red就是数组a的第一个数据。
数组中的数据按顺序存储在内存的连续空间内,由于数据是存储在连续的空间内的,所以每个数据的内存地址(在内存的位置都可以通过数组下标算出,我们也就可以直接访问目标数据(“随机访问”)。
访问
若现在向访问red,只需要指定a[0]就可以访问
删除
但是如果想在任意位置上添加或删除数据,线性表的操作就会很复杂,这涉及到元素的移动,
例如将orange添加到第二个位置
首先要确保线性表的末尾还有存储空间,

然后从将原有的数据网后移动,为新数据腾出位置,首先将blue后移,然后把green后移

最后在空出来的位置上写入orange

这样添加数据就完成了

删除
如果要删除数据,也需要元素进行移动,例如删除orange元素
首先删除目标数据(这里指green)

然后将后面的数据一一往左边的空位移动,先移动green

再移动blue

代码实现
首先先创建一个接口(MyList),接口含有增加(add),删除(remove),获取指定下标的元素(getData)获取元素个数(size),判断是否含有元素(isEmpty),清空元素(clear)
代码如下:
public interface MyList { public void add(int index,Object obj) throws Exception;//增加 public Object remove(int index) throws Exception;//删除 public Object getData(int index) throws Exception;//获取指定下标的元素 public int size();//获取元素个数 public boolean isEmpty();//判断是否含有元素 public void clear();//清空元素 }
然后创建线性表类(MyArray),实现MyList接口,
类中属性:
Object数组(o):用于存储数据
常量(MAX_SIZE):表示线性表的最大存储容量
int类型的size:表示当前线性表的元素个数
类中有两个构造方法
默认构造方法:默认线性表最大容量为10
带MAX_SIZE参数的构造方法:可自定义线性表的最大容量
若干个getter和settter方法
private Object[] o;//用于存储数据 final int MAX_SIZE;//表示线性表的最大存储容量 private int size;//表示当前线性表的元素个数 public MyArray() { MAX_SIZE = 10; size = 0; o = new Object[MAX_SIZE]; } public MyArray(int MAX_SIZE) { this.MAX_SIZE = MAX_SIZE; size = 0; o = new Object[this.MAX_SIZE]; } public Object[] getO() { return o; } public void setO(Object[] o) { this.o = o; } public int getSize() { return size; } public void setSize(int size) { this.size = size; }
实现接口中的方法:
增加(add)方法(如何设计add方法?)
最后一个元素的下标是size-1,要执行往右移动的操作也就是说下标增加了1,最后一个元素的下标变成了size(size-1+1=size)以此类推一直往右移动,index-1就是要插入元素的下标,也就是说index-1这个位置移完就不需要再移动
代码如下:
public void add(int index, Object obj) throws Exception { for (int i = size; i > index ; i--) { o[i] = o[i-1]; } o[index-1] = obj; }
但是java是具有健壮性这个特性的,所以我们也要让自己的代码具有健壮性,检查是否还有空位,检查传入的参数index是否合法
if (size == MAX_SIZE){ throw new Exception("线性表已满"); } if (index < 0 || index > size){ throw new Exception("参数不合法"); }
完整代码就是
public void add(int index, Object obj) throws Exception { if (size == MAX_SIZE){ throw new Exception("线性表已满"); } if (index < 0 || index > size){ throw new Exception("参数不合法"); } for (int i = size; i > index0 ; i--) { o[i] = o[i-1]; } o[index-1] = obj; }
删除(remove)方法(如何设计remove方法)
在删除元素之前先备份元素,删除元素是将元素往左移动,首先是将下标为index的元素移到下标为index的位置上,然后以此类推,直到最后一个元素(下标为size-1)也移动完毕
代码如下
Object obj = o[index];//备份元素 if (index == size-1){ o[index] = null; } for (int i = index; i < size-1; i++) { o[i] = o[i+1];//移动 }
同样我们也要设立关卡,使得代码更具有健壮性
if (size == 0){ throw new Exception("线性表为空,无法删除"); } if (index < 0 || index > size){ throw new Exception("参数不合法"); }
完整代码示例
public Object remove(int index) throws Exception { if (size == 0){ throw new Exception("线性表为空,无法删除"); } if (index < 0 || index > size-1){ throw new Exception("参数不合法"); } Object obj = o[index];//备份元素for (int i = index; i < size-1; i++) { o[i] = o[i+1];//移动 } size--; return obj;//返回被删除的元素 }
专门用于打印线性表数据的方法
//打印线性表的元素 public void print(){ try { for (int i = 0; i < size; i++) { System.out.print(getData(i) + " "); } System.out.println(); } catch (Exception e) { e.printStackTrace(); } }
获得元素的方法
public Object getData(int index) throws Exception { return o[index]; }
获得线性表个数
public int size(){ return size; }
判断是否线性表为空
public boolean isEmpty(){ return (size==0?true:false); }
清空线性表
public void clear() { size = 0; }
接下来就是测试类
public class Demo { public static void main(String[] args) throws Exception { MyArray m = new MyArray(); System.out.println(m.size()); for (int i = 0; i < 10; i++) { m.add(i,i);//添加元素 } m.print();//答应元素 System.out.println(); m.remove(9);//删除指定元素 m.print();//删除后打印 m.add(9,11);//添加元素 m.print();//添加后打印 System.out.println(m.isEmpty());//是否为空,false表示不为空 m.clear();//清空线性表 System.out.println(m.isEmpty());//是否为空,true表示为空 } }
写在最后
小菜鸟学数据结构的第一天,冲冲冲!!!

浙公网安备 33010602011771号