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 }

 

posted @ 2017-02-23 11:22  i廖海  阅读(6624)  评论(0编辑  收藏  举报