数据结构与算法(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,"张三",'男',"18292577820","陕西省西安市"));
			list.add(list.size, new Students(2,"李四",'男',"18292577820","甘肃省兰州"));
			list.add(list.size, new Students(3,"王五",'男',"18292577820","山西省太原市"));
			
			
			System.out.println(list.size());
			for(int i=0;i<list.size();i++) {
				System.out.println(list.get(i));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

运行结果:




猜你喜欢

转载自blog.csdn.net/m0_37897502/article/details/78294479