Java数据结构02----线性表与顺序表
来源:互联网 发布:淘宝助理批量编辑宝贝 编辑:程序博客网 时间:2024/06/05 00:28
本节内容:
- 线性结构
- 线性表抽象数据类型
- 顺序表
- 顺序表应用
一、线性结构:
如果一个数据元素序列满足:
(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内存中,栈内存和堆内存占了很大一部分空间:栈内存的存储是顺序结构,堆内存的存储是离散结构。
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(); } }}
我们要注意插入的规则是什么,不然会觉得这个顺序表打印输出的顺序很奇怪。
运行效果:
3、顺序表效率分析:
- 顺序表插入和删除一个元素的时间复杂度为O(n)。
- 顺序表支持随机访问,顺序表读取一个元素的时间复杂度为O(1)。因为我们是可以通过下标直接访问的,所以时间复杂度是固定的,和问题规模无关。
4、顺序表的优缺点:
- 顺序表的优点是:支持随机访问;空间利用率高(连续分配,不存在空间浪费)。
- 顺序表的缺点是:大小固定(一开始就要固定顺序表的最大长度);插入和删除元素需要移动大量的数据。
5、顺序表的应用:
设计一个顺序表,可以保存100个学生的资料,保存以下三个学生的资料,并打印输出。
代码实现:
(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代表的是:我每次都是在顺序表的最后一个位置(当前线性表的长度的位置)进行插入操作;这样的话,遍历时才是按照张三、李四、王五的顺序进行输出的。
运行效果:
文章来源:http://www.cnblogs.com/smyhvae/p/4758808.html
- 数据结构Java 线性表与顺序表
- 数据结构Java实现02----线性表与顺序表
- Java数据结构02----线性表与顺序表
- 数据结构Java实现02----线性表与顺序表
- 数据结构Java实现02----线性表与顺序表
- 数据结构Java实现【2】----线性表与顺序表
- 数据结构--顺序线性表
- 数据结构--顺序线性表
- 线性数据结构--顺序表
- 数据结构-线性顺序表
- Java数据结构-线性表(顺序表)
- Java,数据结构,线性表,顺序实现
- 线性表-顺序存储(Java数据结构)
- 《数据结构》严蔚敏版(java解)——第二章 线性表02 顺序线性表操作
- 数据结构与算法(Java描述)-3、线性结构与顺序表
- 数据结构-线性表-顺序表
- 数据结构-线性表-顺序表
- 数据结构 线性表 顺序表
- 转载
- codeforces 305A Strange Addition (模拟)
- POJ
- Flask-URL管理
- C#委托的匿函数与lambda公式
- Java数据结构02----线性表与顺序表
- MySQL中出现Access denied for user '**'@'localhost' (using password: YES)
- react-addons-perf 性能优化工具使用
- 在PDF文档中添加附件需要我们如何去进行操作
- JVM TLAB与GC测试
- spring中的ReflectionUtils类
- LAmbda表达式 C#版
- Echarts数据可视化开发参数配置全解
- 杭电暑期多校集训—Euler theorem