线性结构定义
如果一个数据元素序列满足:
(1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素
(2)第一个数据元素没有前驱数据元素;
(3)最后一个数据元素没有后记数据元素
则称这样的数据结构为线性结构
线性表抽象数据类型
线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合。
数据集合可以表示为a0,a1,a2,...an-1,每个数据元素的数据类型可以是任意的类型
操作集合包括如下:
1求元素个数
2插入
3删除
4查找
5判断是否为空
顺序表
计算机有两种基本的存储结构:顺序结构,离散结构,使用顺序结构实现的线性表成为顺序表
栈内存:顺序存储结构, 堆,离散存储结构
顺序表效率分析
(1)顺序表插入和删除一个元素的时间复杂度为O(n)
(2)顺序表支持随机访问,顺序表读取一个元素的时间复杂度为O(1)
(3)顺序表的优点是:支持随机访问,空间利用率高
(4)顺序表的缺点是:大小固定,插入和删除元素需要移动大量的数据
一List.java
//线性表接口
public interface List {
//获得线性表长度
public int size();
//判断线性表是否为空
public boolean isEmpty();
//插入元素
public void insert(int index,Object obj) throws Exception;
//删除元素
public void delete(int index) throws Exception;
//获取指定位置的元素
public Object get(int index) throws Exception;
}
二SequenceList.java
public class SequenceList implements List{
//默认的顺序表的最大长度
final int defaultSize =10;
//最大长度
int maxSize;
//当前长度
int size;
//对象数组
Object[] listArray;
public SequenceList()
{
init(defaultSize);
}
//构造函数的重载
public SequenceList(int size)
{
init(size);
}
//顺序表的初始化方法
private void init(int size)
{
maxSize = size;
this.size = 0;
listArray = new Object[size];
}
@Override
public void delete(int index) throws Exception {
// TODO Auto-generated method stub
if(isEmpty())
{
throw new Exception("顺序表为空,无法删除!");
}
if(index<0||index>size-1)
{
throw new Exception("参数错误!");
}
//移动元素
for(int j=index;j<size-1;j++)
{
listArray[j]=listArray[j+1];
}
size--;
}
@Override
public Object get(int index) throws Exception {
// TODO Auto-generated method stub
if(index<0||index>=size)
{
throw new Exception("参数错误!");
}
return listArray[index];
}
@Override
public void insert(int index, Object obj) throws Exception {
// TODO Auto-generated method stub
//线性表已满
if(size==maxSize)
{
throw new Exception("顺序表已满,无法插入!");
}
//插入位置编号是否合法
if(index<0||index>size)
{
throw new Exception("参数错误!");
}
//移动元素
for(int j=size;j>index;j--)
{
listArray[j]=listArray[j-1];
}
listArray[index]=obj;
size++;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return size==0;
}
@Override
public int size() {
// TODO Auto-generated method stub
return size;
}
}
三Students.java
//学生类
public class Students {
private String sid;// 学号
private String name;// 姓名
private String gender;// 性别
private int age;// 年龄
public Students()
{
}
public Students(String sid,String name,String gender,int age)
{
this.sid = sid;
this.name = name;
this.gender = gender;
this.age =age;
}
public String toString()
{
return "学号:"+this.getSid()+" 姓名:"+this.getName()+" 性别:"+this.getGender()+" 年龄:"+this.getAge();
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
四Test.java文件
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SequenceList list = new SequenceList(100);
try
{
list.insert(list.size, new Students("S0001","张三","男",18));
list.insert(list.size, new Students("S0002","李四","男",19));
list.insert(list.size, new Students("S0003","王五","女",21));
for(int i=0;i<list.size;i++)
{
System.out.println(list.get(i));
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}