线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。通常,称这种存储结构的线性表为顺序表。特点是:逻辑上相邻的数据元素,其物理次序上也是相邻的

顺序表的存储示意图

假设线性表的每个元素与占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。则线性表中地i+1个数据元素的存储位置LOC(a i+1)和第i个数据元素的存储位置LOC(a i)之间有如下关系:

通常的,线性表的地i个数据元素ai的存储位置为:

每一个数据元素的存储位置都和线性表中的起始位置相差一个常数,这个常熟和数据元素在线性表中的位序成正比。所以,只要确定了存储线性表的起始位置,线性表中任意数据元素都可以随机存取。所以,线性表的顺序存储结构是一种随机存取的存储结构。

实现顺序表(java)

首先建立一个List接口,用来定义顺序表的一些操作

  1. package 线性表的顺序结构;
  2. public interface List {
  3. //返回顺序表的大小
  4. public int size();
  5. //判断线性表中是否为空
  6. public boolean isEmpty();
  7. //向线性表中插入数据元素
  8. public boolean insert(int index, Object obj) throws Exception;
  9. //删除线性表中指定元素
  10. public boolean delete(int index) throws Exception;
  11. //获取线性表的指定元素
  12. public Object getElem(int index);
  13. //判断数据元素是否在链表中
  14. public int searchList(Object obj);
  15. //销毁线性表
  16. public void destroyList();
  17. //将线性表置为空表
  18. public void clearList();
  19. //返回线性表中第一个值与obj相同的元素在线性表中的位置
  20. public Object locateElem(Object obj);
  21. }

实现顺序表的操作方法:

  1. package 线性表的顺序结构;
  2. public class SqList implements List {
  3. //默认的顺序表的最大长度
  4. final int DefaultSizs = 10;
  5. //顺序表的长度最大值
  6. int MaxSize;
  7. //顺序表的当前长度
  8. int size;
  9. //用于存储顺序表的数据元素
  10. Object[] listArray;
  11. public SqList() {
  12. this.init(this.DefaultSizs);
  13. }
  14. public SqList(int size) {
  15. this.init(size);
  16. }
  17. /**
  18. * 初始化顺序表
  19. * @param size
  20. */
  21. public void init(int size) {
  22. this.MaxSize = size;
  23. this.size = 0;
  24. this.listArray = new Object[size];
  25. }
  26. @Override
  27. /**
  28. * 获得顺序表的长度
  29. */
  30. public int size() {
  31. // TODO Auto-generated method stub
  32. return size;
  33. }
  34. @Override
  35. /**
  36. * 判断顺便表是否为空
  37. */
  38. public boolean isEmpty() {
  39. // TODO Auto-generated method stub
  40. return size == 0;
  41. }
  42. @Override
  43. /**
  44. * 在指定位置插入数据元素到顺序表
  45. */
  46. public boolean insert(int index, Object obj) throws Exception {
  47. // TODO Auto-generated method stub
  48. if(index < 1 || index > size + 1) return false;
  49. if(size >= MaxSize) return false;
  50. for(int j = size - 1; j >= index; j--) {
  51. this.listArray[j + 1] = this.listArray[j];
  52. }
  53. this.listArray[index - 1] = obj;
  54. ++size;
  55. return true;
  56. }
  57. @Override
  58. /**
  59. * 删除顺序表中指定位置的数据元素
  60. */
  61. public boolean delete(int index) throws Exception {
  62. // TODO Auto-generated method stub
  63. if(index < 1 || index > size) return false;
  64. for(int j = index; j <= size - 1; j++) {
  65. this.listArray[j - 1] = this.listArray[j];
  66. }
  67. --size;
  68. return true;
  69. }
  70. @Override
  71. /**
  72. * 获得指定数据元素
  73. */
  74. public Object getElem(int index) {
  75. // TODO Auto-generated method stub
  76. if(index < 1 || index > size) return null;
  77. return this.listArray[index - 1];
  78. }
  79. @Override
  80. /**
  81. * 查找数据元素是否在顺序表中
  82. * 若在表中,返回该数据元素在顺序表的序号
  83. */
  84. public int searchList(Object obj) {
  85. // TODO Auto-generated method stub
  86. for(int j = 0; j < size; j++) {
  87. if(this.listArray[j] == obj) return j + 1;
  88. }
  89. return 0;
  90. }
  91. public static void main(String[] args) {
  92. SqList list = new SqList(2);
  93. try {
  94. list.insert(1, 100);
  95. list.insert(2, 50);
  96. list.insert(3, 20);
  97. list.insert(4, 90);
  98. for (int i = 1; i <= list.size; i++) {
  99. System.out.println("第" + i + "个数为" + list.getElem(i));
  100. }
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. }
  105. @Override
  106. /**
  107. * 销毁顺序表
  108. */
  109. public void destroyList() {
  110. // TODO Auto-generated method stub
  111. this.listArray = null;
  112. this.size = 0;
  113. }
  114. @Override
  115. /**
  116. * 清空顺序表
  117. */
  118. public void clearList() {
  119. // TODO Auto-generated method stub
  120. if(this.listArray != null && this.listArray.length != 0) {
  121. this.listArray = new Object[this.MaxSize];
  122. }
  123. }
  124. @Override
  125. public Object locateElem(Object obj) {
  126. // TODO Auto-generated method stub
  127. for(int j = 0; j < size; j++) {
  128. if(this.listArray[j] == obj) return j + 1;
  129. }
  130. return null;
  131. }
  132. }

但是在上面的代码中我们和容易的看到一个缺点,那就是存放数据元素的数组是定长的,即,上面实现的顺序表是静态顺序表。那么当数据量很大的时候,我们需要进行扩容,否则无法存储下所有数据。

修改SqList类,增加一个判断是否需要扩容的方法:

  1. //进行扩容
  2. public void seqListDempty() {
  3. if(size == MaxSize) {
  4. MaxSize *= 2;
  5. Object[] newArr = new Object[MaxSize];
  6. for (int i = 0; i < size; i++) {
  7. newArr[i] = this.listArray[i];
  8. }
  9. this.listArray = newArr;
  10. }
  11. }

同时修改insert()方法:

  1. @Override
  2. /**
  3. * 在指定位置插入数据元素到顺序表
  4. */
  5. public boolean insert(int index, Object obj) throws Exception {
  6. // TODO Auto-generated method stub
  7. if(index < 1 || index > size + 1) return false;
  8. if(size >= MaxSize) seqListDempty();
  9. for(int j = size - 1; j >= index; j--) {
  10. this.listArray[j + 1] = this.listArray[j];
  11. }
  12. this.listArray[index - 1] = obj;
  13. ++size;
  14. return true;
  15. }

这样我们就实现了动态顺序表

线性表中顺序表的的理解和实现(java)的更多相关文章

  1. [Java算法分析与设计]--线性结构与顺序表(List)的实现应用

    说到线性结构,我们应该立马能够在脑子里蹦出"Array数组"这个词.在Java当中,数组和对象区别基本数据类型存放在堆当中.它是一连串同类型数据存放的一个整体.通常我们定义的方式为 ...

  2. C#线性表之顺序表

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

  3. c/c++ 线性表之顺序表

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

  4. [C++]线性链表之顺序表<一>

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

  5. 线性表之顺序表C++实现

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

  6. [C++]线性链表之顺序表<二>

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

  7. [数据结构 - 第3章] 线性表之顺序表(C++实现)

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

  8. [C++]数据结构:线性表之顺序表

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

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

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. Java Thread系列(十)Future 模式

    Java Thread系列(十)Future 模式 Future 模式适合在处理很耗时的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 一.Future 模式核心思想 如下的请求 ...

  2. 分布式java应用基础与实践

      始读于2014年4月30日,完成于2014年6月6日15:43:39. 阿里巴巴高级研究员林昊早年的书了,这些理论放到今天估计工作一两年的人都耳熟能详了,我个人很早以前就知道此书一直没有找到资源, ...

  3. python机器学习工具包scikit-learn

    scikit-learn这个非常强大的python机器学习工具包 http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.ht ...

  4. FPGA时序约束和timequest timing analyzer

    FPGA时序约束 时钟约束 #************************************************************** # Create Clock #****** ...

  5. iphone在微信中audio 音频无法自动播放

    问题: Html5的audio 音频在电脑端和android端都可以实现自动播放,在iphone上无法实现,下面针对的是微信浏览器里面的解决方法 html代码: <div id="au ...

  6. context:propertyPlaceholder

    Activates replacement of ${...} placeholders by registering a PropertySourcesPlaceholderConfigurer w ...

  7. (巴什博弈 sg函数入门1) Brave Game -- hdu -- 1846

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1846 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则: ...

  8. 2016-2017-2 20155223 实验二 《Java面向对象程序设计》

    2016-2017-2 苏黄永郦 实验二 实验报告 前期准备工作--程序安装 -问题一 开始的时候我就在老师博客的指导下安装IDEA插件JUnit Generator V2.0.当然我的IDEA肯定没 ...

  9. Javascript的事件模型和Promise实现

    1. Javascript的运行时模型——事件循环 JS的运行时是个单线程的运行时,它不像其他编程语言,比如C++,Java,C#这些可以进行多线程操作的语言.当它执行一个函数时,它只会一条路走到黑, ...

  10. 如何在powerdesign15.1中使用自增列

    点击要设置为自增列的列 右键选择properties(或者按下ALT+enter) 点选红框,再点击Microsoft选项卡, 输入开始值和自增值即可 来自为知笔记(Wiz)