数据结构Java实现02----线性表与顺序表

时间:2022-12-16 13:28:28

【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4758808.html

【正文】

本节内容:

  • 线性结构
  • 线性表抽象数据类型
  • 顺序表
  • 顺序表应用

一、线性结构

如果一个数据元素序列满足:

(1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素;

(2)第一个数据元素没有前驱数据元素;

(3)最后一个数据元素没有后继数据元素。

则称这样的数据结构为线性结构。

二、线性表抽象数据类型:

1、线性表抽象数据类型的概念:

线性表抽象数据类型主要包括两个方面:既数据集合和该数据集合上的操作集合。

数据集合:

  可以表示为a0,a1,a2,...an-1,每个数据元素的数据类型可以是任意的类型。

操作集合包括如下:

1.求元素个数

2.插入

3.删除

4.查找

5.判断是否为空

2、设计线性表抽象数据类型的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;
}

然后我们让子类去实现这个接口就行了。

三、顺序表:(在物理存储结构上连续,大小固定)

1、顺序表的概念:

计算机有两种基本的存储结构(物理存储结构):顺序结构、离散结构。使用顺序结构实现的线性表称为顺序表。如下图所示:

数据结构Java实现02----线性表与顺序表

Java内存中,栈内存和堆内存占了很大一部分空间:栈内存的存储是顺序结构,堆内存的存储是离散结构。

2、设计顺序表类:

我们在上面第二段的List接口基础之上,设计一个顺序表:

(1)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;
}

(2)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 - 1; j >= index; j--) {
listArray[j + 1] = listArray[j];
}

listArray[index] = obj; //不管当前线性表的size是否为零,这句话都能正常执行,即都能正常插入
size++;

} @Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
} @Override
public int size() {
// TODO Auto-generated method stub
return size;
}
}

我们来看一下第54行的插入操作insert()方法:如果需要在index位置插入一个数据,那么index后面的元素就要整体往后移动一位。这里面需要特别注意的是:

插入操作:移动元素时,要从后往前操作,不能从前往后操作,不然元素会被覆盖的

删除元素:移动元素时,要从前往后操作。

(3)测试类:

public class Test {

    public static void main(String[] args) {

        SequenceList list = new SequenceList(20);

        try {
list.insert(0, 100);
list.insert(0, 50);
list.insert(1, 20); for (int i = 0; i < list.size; i++) {
System.out.println("第" + i + "个数为" + list.get(i));
} } catch (Exception e) {
e.printStackTrace();
}
}
}

我们要注意插入的规则是什么,不然会觉得这个顺序表打印输出的顺序很奇怪。

运行效果:

数据结构Java实现02----线性表与顺序表

3、顺序表效率分析:

  • 顺序表插入和删除一个元素的时间复杂度为O(n)。
  • 顺序表支持随机访问,顺序表读取一个元素的时间复杂度为O(1)。因为我们是可以通过下标直接访问的,所以时间复杂度是固定的,和问题规模无关。

4、顺序表的优缺点:

  • 顺序表的优点是:支持随机访问;空间利用率高(连续分配,不存在空间浪费)。
  • 顺序表的缺点是:大小固定(一开始就要固定顺序表的最大长度)插入和删除元素需要移动大量的数据。

5、顺序表的应用:

设计一个顺序表,可以保存100个学生的资料,保存以下三个学生的资料,并打印输出。

数据结构Java实现02----线性表与顺序表

代码实现:

(1)List.java:

  和上面的代码保持不变

(2)SequenceList.java:

  和上面的代码保持不变

(3)Students.java:学生类

//学生类
public class Students { private String id;// 学号
private String name;// 姓名
private String gender;// 性别
private int age;// 年龄 public Students() { } public Students(String sid, String name, String gender, int age) {
this.id = sid;
this.name = name;
this.gender = gender;
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} 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;
} public String toString() {
return "学号:" + this.getId() + " 姓名:" + this.getName() + " 性别:" + this.getGender() + " 年龄:" + this.getAge();
} }

(4)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.size代表的是:我每次都是在顺序表的最后一个位置(当前线性表的长度的位置)进行插入操作。这一行里,size是等于0
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();
}
} }

注意第11行的注释:第一个参数list.size代表的是:我每次都是在顺序表的最后一个位置(当前线性表的长度的位置)进行插入操作;这样的话,遍历时才是按照张三、李四、王五的顺序进行输出的。

运行效果:

数据结构Java实现02----线性表与顺序表

数据结构Java实现02----线性表与顺序表的更多相关文章

  1. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  2. &lbrack;C&plus;&plus;&rsqb;数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  3. &lbrack;数据结构 - 第3章&rsqb; 线性表之顺序表(C&plus;&plus;实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  4. C&num;线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  5. &lbrack;C&plus;&plus;&rsqb;线性链表之顺序表&lt&semi;一&gt&semi;

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  6. c&sol;c&plus;&plus; 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  7. &lbrack;C&plus;&plus;&rsqb;线性链表之顺序表&lt&semi;二&gt&semi;

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  8. 线性表之顺序表C&plus;&plus;实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

  9. 数据结构(java版)学习笔记(二)——线性表之顺序表

    顺序表的优点: 随机存取元素方便,根据定位公式容易确定表中每个元素的存储位置,所以要指定第i个结点很方便 简单,直观 顺序表的缺点: 插入和删除结点困难 扩展不灵活,难以确定分配的空间 容易造成浪费 ...

随机推荐

  1. Effective Java 68 Prefer executors and tasks to threads

    Principle The general mechanism for executing tasks is the executor service. If you think in terms o ...

  2. 织梦DedeCms调用全站相关文章方法

    织梦DedeCms 有个标签可以调用相关文章,通过下面的修改可以调用全站的相关文章,文章页内显示相关文章内容,可以提高关键词密度,还是挺不错的. 模板调用代码 <div>     < ...

  3. Contoso 大学 - 使用 EF Code First 创建 MVC 应用

    原文 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Co ...

  4. javascript判断浏览器

    function getExplorer() { //IE if (navigator.userAgent.indexOf("MSIE")>=0) { } //Firefox ...

  5. javascript之Function函数

    在javascript里,函数是可以嵌套的. 如: function(){ funcrion square(x){ return x*x;  } return square(10); } 在javas ...

  6. centos解压bz2文件出错

    出现的问题: 用tar 解压 tar.bz2文件出错 debian:/usr/src# tar jxf linux-2.6.26.tar.bz2tar: bzip2: Cannot exec: No ...

  7. Github终于连上了hexo

    2018-01-2722:59:28 我的妈呀,看看这感人的网速,哎不想吐槽在中国连外网的速度 总结一下连接过程吧 漫漫长征路,难的要死. 一.github的注册和使用不再详述 二.Git Desk ...

  8. &lbrack;物理学与PDEs&rsqb;第4章习题1 反应力学方程组形式的化约 - 动量方程与未燃流体质量平衡方程

    试证明: 利用连续性方程, 可将动量方程 (2. 14) 及未燃流体质量平衡方程 (2. 16) 分别化为 (2. 19) 与 (2. 20) 的形式. 证明: 注意到 $$\beex \bea \c ...

  9. Spring 使用介绍(三)—— 资源

    一.Resource接口 Spring提供Resource接口,代表底层外部资源,提供对底层外部资源的一致性访问接口 public interface InputStreamSource { Inpu ...

  10. python 3字符编码

    python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...