一、線性結構定義
如果一個數據元素序列滿足:
(1)除第一個和最後一個數據元素外,每個數據元素只有一個前驅數據元素和一個後繼數據元素;
(2)第一個數據元素沒有前驅數據元素;
(3)最後一個數據元素沒有後繼數據元素。
則稱這樣的數據結構爲線性結構。
二、線性表抽象數據類型
線性表抽象數據類型主要包括兩個方面:即數據集合和該數據集合上的操作集合。
數據集合可以表示爲a0,a1,a2,...an-1,每個數據元素的數據類型可以是任意的類型。
操作集合包括如下:
1.求元素個數
2.插入
3.刪除
4.查找
5.判斷是否爲空
三、順序表
計算機有兩種基本的存儲結構:順序結構、離散結構。使用順序結構實現的線性表稱爲順序表。
四、順序表效率分析
順序表插入和刪除一個元素的時間複雜度爲O(n)。
順序表支持隨機訪問,順序表讀取一個元素的時間複雜度爲O(1)。
順序表的優點是:支持隨機訪問,空間利用率高。
順序表的缺點是:大小固定,插入和刪除元素需要移動大量的數據
五、順序表實現
//設計線性表抽象數據類型的Java接口。 public interface List { //插入元素 public void add(int index,Object obj) throws Exception; //刪除元素 public void delete(int index) throws Exception; //獲取某個元素 public Object get(int index) throws Exception; //判斷是否爲空 public boolean isEmpty(); //獲得集合的長度 public int size(); }
//順序表實現 public class SequenceList implements List { //默認長度 public final int defalutSize=20; //最大長度 int maxSize; //當前長度 int size; //存儲變量的數組 Object objectArray[]; public SequenceList() { init(defalutSize); } public SequenceList(int size) { init(size); } private void init(int size) { this.maxSize=size; this.size=0; objectArray=new Object[size]; } //插入元素 @Override public void add(int index, Object obj) throws Exception { if(index==maxSize) { throw new Exception("數組已滿,不能插入!"); } if(index<0||index>size) { throw new Exception("增加元素時參數錯誤!"); } //移動元素 for(int i=size;i>index;i--) { objectArray[i]=objectArray[i-1]; } objectArray[index]=obj; size++; } //刪除元素 @Override public void delete(int index) throws Exception { //判斷是否爲空 if(isEmpty()) { throw new Exception("數組爲空,不能刪除!"); } if(index<0||index>size-1) { throw new Exception("刪除元素時參數錯誤!"); } for(int i=index;i<size;i++) { objectArray[i]=objectArray[i+1]; } size--; } //得到一個元素 @Override public Object get(int index) throws Exception { if(index<0||index>size-1) { throw new Exception("得到元素參數錯誤!"); } return objectArray[index]; } @Override public boolean isEmpty() { return size==0; } @Override public int size() { return size; } }
//自定義學生實體類 public class Students { //學生的id private int id; //學生的姓名 private String name; //學生的性別 private char sex; //學生的聯繫方式 private String phone; //學生的地址 private String address; //無參的構造方法 public Students() {}; //五個參數的構造方法 public Students(int id,String name,char sex,String phone,String address) { this.id=id; this.name=name; this.sex=sex; this.phone=phone; this.address=address; } //打印學生信息 void printStudentsInfo() { System.out.println(id); System.out.println(name); System.out.println(sex); System.out.println(phone); System.out.println(address); } public static void main(String[] args) { Students stu=new Students(1,"張三",'男',"18267572266","陝西省西安市....."); stu.printStudentsInfo(); } public String toString() { return this.id+" "+this.name+" "+this.sex+this.phone+" "+this.address; } }
//測試 public class SquenceListDemo { public static void main(String[] args) { SequenceList list=new SequenceList(10); try { list.add(list.size, new Students(1,"張三",'男',"19966663332","陝西省西安市")); list.add(list.size, new Students(2,"李四",'男',"19966663332","甘肅省蘭州")); list.add(list.size, new Students(3,"王五",'男',"19966663332","山西省太原市")); System.out.println(list.size()); for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } } catch (Exception e) { e.printStackTrace(); } } }