用数组实现线性表
用数组实现线性表
现在开始进入数据结构的复习!数据结构中最简单的结构就是线性表,线性表又分为多种类型,这篇文章讲的是基于数组实现的线性表,说明了就是自己来实现ArrayList集合,ArrayList采用的数据结构是数组,存储的元素有序但不唯一,查找效率高,但是增删没有LinkedList的效率高。 通过这篇文章你可以知道ArrayList的基本工作方式。
设计ADT
数据结构实际上就是针对一系列数据,设计一系列针对这些数据的操作方法,由于这些数据和操作方法一般来说是共性的特征,所以我们可以使用接口来进行抽象。接口代码如下所示:public interface ListInterface<T> { public boolean add(T newEntry); public boolean add(int newPosition,T newEntry); public T remove(int givenPosition); public void clear(); public boolean replace(int givenPosition,T newEntry); public T getEntry(int givenPosition); public boolean contains(T anEntry); public int getLength(); public boolean isEmpty(); public boolean isFull(); public void display(); public Iterator<T> getIterator(); }线性表类
定义一个类,implements上面的接口,在类中数据域须为数组,实现接口中声明的操作方法来对数组中的数据进行操作。public class array_list<T> implements ListInterface<T> { PRivate T[] list; private int length; private static final int MAX_AIZE=10; public array_list(){ this(MAX_AIZE); } public array_list(int capacity) { length=0; list=(T[]) new Object[capacity]; } public void makeRoom(int newPosition){ for(int i=length;i>=newPosition;i--) list[i]=list[i-1]; } public void removeGap(int givenPosition){ assert givenPosition>0 && givenPosition<length; for(int i=givenPosition-1;i<length-1;i++) list[i]=list[i+1]; } public boolean isArrayFull() { return length==list.length; } @SuppressWarnings("unchecked") private void doubleArray(){ T[] oldArray=list; list=(T[]) new Object[2*oldArray.length]; System.arraycopy(oldArray, 0, list, 0, oldArray.length); } @Override public boolean add(T newEntry) { if(isArrayFull()) doubleArray(); list[length]= newEntry; length++; return true; } @Override public boolean add(int newPosition, T newEntry) { if(isArrayFull()) doubleArray(); makeRoom(newPosition); list[newPosition-1]= newEntry; length++; return true; } @Override public T remove(int givenPosition) { T result=null; if(givenPosition>0 && givenPosition<=length){ assert !isEmpty(); result=list[givenPosition-1]; if(givenPosition<length) removeGap(givenPosition); length--; } return result; } @Override public void clear() { length=0; for(int i=0;i<list.length;i++) list[i]=null; } @Override public boolean replace(int givenPosition, T newEntry) { boolean isSuccessful=true; if(givenPosition>0 && givenPosition<=length) list[givenPosition-1]= newEntry; else isSuccessful=false; return isSuccessful; } @Override public T getEntry(int givenPosition) { T result=null; if(givenPosition>0 && givenPosition<=length){ assert !isEmpty(); result=list[givenPosition-1]; } return result; } @Override public boolean contains(T anEntry) { boolean found=false; for(int i=0;!found && i<length;i++) if(anEntry.equals(list[i])) found=true; return found; } @Override public int getLength() { return length; } @Override public boolean isEmpty() { return length==0; } @Override public boolean isFull() { // return length==entry.length; return false; } @Override public void display() { Iterator iterator=getIterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+" "); } } @Override public Iterator<T> getIterator() { return new IteratorForArrayList(); } private class IteratorForArrayList implements Iterator<T>{ private int nextIndex; private boolean wasNextCalled; public IteratorForArrayList() { nextIndex=0; wasNextCalled=false; } @Override public boolean hasNext() { return nextIndex<length; } @Override public T next() { if(hasNext()){ wasNextCalled=true; T nextEntry=list[nextIndex]; nextIndex++; return nextEntry; }else throw new NoSuchElementException(""); } public void remove(){ if(wasNextCalled){ array_list.this.remove(nextIndex); nextIndex--; wasNextCalled=false; }else throw new IllegalStateException(""); } } }测试代码
public class main { private static array_list<Integer> list; public static void main(String[] args) { list=new array_list<Integer>(); for(int i=0;i<20;i++) list.add(i); list.display(); System.out.println(); list.add(16, 167); list.display(); System.out.println(); list.replace(3, 101); list.display(); System.out.println(); list.remove(6); list.display(); System.out.println(); System.out.println(list.contains(99)); } }测试结果 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 167 15 16 17 18 19 0 1 101 3 4 5 6 7 8 9 10 11 12 13 14 167 15 16 17 18 19 0 1 101 3 4 6 7 8 9 10 11 12 13 14 167 15 16 17 18 19 false