java实现顺序表
现在常用的数据结构分为线性结构和非线性结构,而线性结构包括表,栈,队列,非线性包括树,图等等。按照数据存储方式有可以将表分为顺序表和链表,栈分为顺序栈,链栈,队列也可以有链是队列。在高级语言中通常用数组来表示顺序存储结构,所以表,栈,队列都可以用数组来做。
1 package arrayList; 2 3 import java.util.Arrays; 4 import java.util.Date; 5 6 /** 7 * 顺序表ArrayList,用数组表示。一组连续的地址空间 8 * @author LH-PC 9 * @param <E> 10 */ 11 public class ArrayList<E> { 12 private Object[] data = null; //data 用来保存此线性表的数据域 13 private int length; //线性表的容量 14 private int current; //实际表长 15 16 /** 17 * 默认将大小设置为10 18 */ 19 public ArrayList(){ 20 this(10); 21 } 22 23 24 /** 25 * 初始化线性表,声明数组大小 26 * @param initialSize 数组大小 27 */ 28 public ArrayList(int initialSize){ 29 if(initialSize >= 0){ 30 this.length = initialSize; //设置线性表容量 31 this.data = new Object[initialSize]; //初始化数组 32 this.current = 0; //下标设置为0 33 }else { 34 throw new RuntimeException("初始化大小不能小于0:" + initialSize); //异常提示 35 } 36 37 } 38 39 40 /** 41 * 在线性表末尾添加元素,添加之前判断线性表是否已经满了 42 * @param e 添加的元素 43 * @return 成功返回真 44 */ 45 public boolean add(E e){ 46 //判断是否已满 47 ensureCapacity(); 48 //将元素添加到数组末尾 49 this.data[current++] = e; 50 // ++current; //下标++ 51 return true; 52 } 53 54 /** 55 * 删除指定位置的元素 56 * @param index 57 * @return 58 */ 59 public boolean removeToIndex(int index){ 60 //删除数组的元素:使用改变数组下标的方式达到删除的效果。 61 //遍历数组匹配指定下标,让指定下标右边的元素往左移动改变下标。最后再将最右边的下标删除 62 //a b c 63 //0 1 2 64 //data[index] = data[index + 1]; //改变右边下标 65 //data //删除最右边的下标 66 //从待删除下标处开始遍历,将右边的元素往左移 67 if(index >= current){ //如果index大于最大长度,返回假 68 System.err.print(new Date() + ": 下标超出表长"); 69 return false; 70 } 71 for (int i = index; i < current - 1; i++) { 72 data[i] = data[i+1]; //该表元素下标 73 } 74 data[current-1] = null; //将原来下标最右边的一位元素变成null 75 --current; //实际表长-1 76 return true; 77 } 78 79 80 /** 81 * 根据下标返回元素值 82 * @param index 83 * @return 84 */ 85 public E get(int index){ 86 if(index >= 0){ 87 return (E) data[index]; 88 }else { 89 throw new RuntimeException("下标不能小于0:" + index); 90 } 91 } 92 93 /** 94 * 判断表容量是否超出预定大小,如果超出将自动扩充容量 95 * 96 */ 97 public void ensureCapacity(){ 98 //判断表实际长度是否超出表最大容量 99 if(current >= length){ 100 length *= 2; //将表最大容量*2 101 data = Arrays.copyOf(data, length); //将原数组进行拷贝 102 } 103 104 } 105 106 107 /** 108 * 返回顺序表实际表长 109 * @return 110 */ 111 public int size(){ 112 return this.current; 113 } 114 115 /** 116 * 返回表容量 117 * @return 118 */ 119 public int length(){ 120 return this.length; 121 } 122 123 /** 124 * 125 * 判断表是否为空 126 * @param args 127 */ 128 public boolean isEmpty(){ 129 //return (current == 0) ? true : false; 130 return current == 0; //如果current == 0,说明为空返回真,否则返回假 131 } 132 133 //主方法测试 134 public static void main(String[] args) { 135 ArrayList<Integer> list = new ArrayList<Integer>(); //创建arrayList 136 for (int i = 1; i <= 22; i++) { 137 list.add(i); 138 } 139 list.removeToIndex(0); 140 // list.removeToIndex(list.size()); 141 //遍历list数组 142 for (int i = 0; i < list.size(); i++) { 143 System.out.println(list.get(i)); 144 } 145 146 } 147 148 }
加油