數據結構與算法(Java描述)-3、線性結構與順序表

一、線性結構定義

如果一個數據元素序列滿足:
(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();
		}
		
	}

}
 

 



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章