java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

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

顺序表的存储示意图

12122ce588573a248cbd9946667950d6.png

292b24de017b2e9ab84875a2dbdaca8d.png

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

4fdf7642c79495068cd0e01cd7794fe8.gif

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

d9a1a642224b5732786d60b23d1ac684.gif

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

实现顺序表(java)

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

package 线性表的顺序结构;

public interface List {

//返回顺序表的大小

public int size();

//判断线性表中是否为空

public boolean isEmpty();

//向线性表中插入数据元素

public boolean insert(int index, Object obj) throws Exception;

//删除线性表中指定元素

public boolean delete(int index) throws Exception;

//获取线性表的指定元素

public Object getElem(int index);

//判断数据元素是否在链表中

public int searchList(Object obj);

//销毁线性表

public void destroyList();

//将线性表置为空表

public void clearList();

//返回线性表中第一个值与obj相同的元素在线性表中的位置

public Object locateElem(Object obj);

}

实现顺序表的操作方法:

package 线性表的顺序结构;

public class SqList implements List {

//默认的顺序表的最大长度

final int DefaultSizs = 10;

//顺序表的长度最大值

int MaxSize;

//顺序表的当前长度

int size;

//用于存储顺序表的数据元素

Object[] listArray;

public SqList() {

this.init(this.DefaultSizs);

}

public SqList(int size) {

this.init(size);

}

/**

* 初始化顺序表

* @param size

*/

public void init(int size) {

this.MaxSize = size;

this.size = 0;

this.listArray = new Object[size];

}

@Override

/**

* 获得顺序表的长度

*/

public int size() {

// TODO Auto-generated method stub

return size;

}

@Override

/**

* 判断顺便表是否为空

*/

public boolean isEmpty() {

// TODO Auto-generated method stub

return size == 0;

}

@Override

/**

* 在指定位置插入数据元素到顺序表

*/

public boolean insert(int index, Object obj) throws Exception {

// TODO Auto-generated method stub

if(index < 1 || index > size + 1) return false;

if(size >= MaxSize) return false;

for(int j = size - 1; j >= index; j--) {

this.listArray[j + 1] = this.listArray[j];

}

this.listArray[index - 1] = obj;

++size;

return true;

}

@Override

/**

* 删除顺序表中指定位置的数据元素

*/

public boolean delete(int index) throws Exception {

// TODO Auto-generated method stub

if(index < 1 || index > size) return false;

for(int j = index; j <= size - 1; j++) {

this.listArray[j - 1] = this.listArray[j];

}

--size;

return true;

}

@Override

/**

* 获得指定数据元素

*/

public Object getElem(int index) {

// TODO Auto-generated method stub

if(index < 1 || index > size) return null;

return this.listArray[index - 1];

}

@Override

/**

* 查找数据元素是否在顺序表中

* 若在表中,返回该数据元素在顺序表的序号

*/

public int searchList(Object obj) {

// TODO Auto-generated method stub

for(int j = 0; j < size; j++) {

if(this.listArray[j] == obj) return j + 1;

}

return 0;

}

public static void main(String[] args) {

SqList list = new SqList(2);

try {

list.insert(1, 100);

list.insert(2, 50);

list.insert(3, 20);

list.insert(4, 90);

for (int i = 1; i <= list.size; i++) {

System.out.println("第" + i + "个数为" + list.getElem(i));

}

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

/**

* 销毁顺序表

*/

public void destroyList() {

// TODO Auto-generated method stub

this.listArray = null;

this.size = 0;

}

@Override

/**

* 清空顺序表

*/

public void clearList() {

// TODO Auto-generated method stub

if(this.listArray != null && this.listArray.length != 0) {

this.listArray = new Object[this.MaxSize];

}

}

@Override

public Object locateElem(Object obj) {

// TODO Auto-generated method stub

for(int j = 0; j < size; j++) {

if(this.listArray[j] == obj) return j + 1;

}

return null;

}

}

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

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

//进行扩容

public void seqListDempty() {

if(size == MaxSize) {

MaxSize *= 2;

Object[] newArr = new Object[MaxSize];

for (int i = 0; i < size; i++) {

newArr[i] = this.listArray[i];

}

this.listArray = newArr;

}

}

同时修改insert()方法:

@Override

/**

* 在指定位置插入数据元素到顺序表

*/

public boolean insert(int index, Object obj) throws Exception {

// TODO Auto-generated method stub

if(index < 1 || index > size + 1) return false;

if(size >= MaxSize) seqListDempty();

for(int j = size - 1; j >= index; j--) {

this.listArray[j + 1] = this.listArray[j];

}

this.listArray[index - 1] = obj;

++size;

return true;

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

akka连接是什么_什么是Akka?

akka连接是什么在深入探讨什么是Akka之前&#xff0c;让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现&#xff0c;应用程序设计演变为更多的基于流程或任务的设计模型…

java socket 判断断网_java socket 判断对方在线或离线、断线

1 在客户端和服务器端做心跳检测(这个后来我放弃了)2 客户端中断连接&#xff0c;服务器会抛出异常&#xff0c;利用这点3这是我为什么不用心跳包的原因&#xff0c;因为不需要了。 有的时候&#xff0c;我们可能网络突然中断了。但是服务器依然会监听那个连接。而且很长都不抛…

java 可重入读写锁 ReentrantReadWriteLock 详解

详见&#xff1a;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁&#xff0c;一个用于只读操作&#xff0c;一个用于写入操作。只要没有writer&#xff0c;读取锁可以由多个reader线程同时保持。写入锁是独占的…

将JPA Hibernate与OptaPlanner集成

我们一直在改进OptaPlanner与JEE其余部分的集成&#xff0c;因此&#xff0c;构建可以正常工作的最终用户应用程序更加容易。 让我们看一下改进的JPA Hibernate集成。 基础 JPA Hibernate和OptaPlanner都可以在POJO&#xff08;普通的旧Java对象&#xff09;上工作&#xff0c…

c java 系统开发_java开发系统内核:使用C语言开发系统应用程序

更详细的讲解和代码调试演示过程&#xff0c;请参看视频用java开发C语言编译器如果你对机器学习感兴趣&#xff0c;请参看一下链接&#xff1a;机器学习&#xff1a;神经网络导论我们的操作系统通过增添内核接口导出机制后&#xff0c;已经可以作为平台&#xff0c;运行应用程序…

php 跨二级域名 设置cookie

登入也设置cookie setcookie(user_id, authlogin("user_id", "ENCODE"), time()(3600*24*30), "/", ".lfb365.com"); authlogin()方法为将user_id进行编码&#xff0c;非内置方法 退出页清除cookie setcookie("user_id", &q…

java jbutton文字_java JButton 改变按钮文字

展开全部因为 i 和 j 是局部变量&#xff0c;62616964757a686964616fe78988e69d8331333337383933在内部类中不允许访问局部变量&#xff0c;如果要访问必须添加 final。所以有个折中的办法&#xff0c;再声明两个中间变量&#xff0c;并定义为 final 类型的&#xff0c;你在内部…

抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查在JDK 7中 &#xff0c;向Throwable类&#xff08; Exception和Error类的父类&#xff09;添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”&#xff08;不要与吞咽或忽略异常的不良做法相混淆&#xff09;。 …

win7下装ubuntu14.04双系统

一、给ubuntu准备安装空间计算机--右键--管理-磁盘管理--选择一个空余空间较多的磁盘--右键--压缩卷--压缩大概60G空间&#xff08;接下来ubuntu就会装到这60G里面&#xff09;二、制作启动u盘用ultraiso将ubuntu14.04镜像写入u盘&#xff0c;制作启动u盘三、u盘启动&#xff0…

java bundle_java.util.ResourceBundle国际化用法详解

初识国际化和ResourceBundle这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念&#xff0c;两者都是一起出现的。可以说&#xff0c;国际化的目的就是为了实现本地化&#xff0c;详细的介绍可以看本文的最后。比如对于“取消”&#xff0c;中文中我们使用“…

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是&#xff0c;尽管也有一些有趣的考虑&#xff0c;但读取模型经常被忽略。 在本文中&#xff0c;我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

JSP数据交互

JSP数据交互 一、jsp中java小脚本 1.<% java代码段%> 2.<% java表达式%>不能有分号 3.<%!成员变量和函数声明%>二、注释 1.<!--html注释-->客户端可以看到 2.<%--jsp注释--%>客户端不能看到三、jsp页面的的执行过程 1.客户端请求&#xff08;输入…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说&#xff0c;随着我们项目的迭代以及业务的越来越复杂&#xff0c;项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时&#xff0c;我们就需要考虑是否需要对项目进行重构了&#xff0c;或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

flink 复杂事件_复杂的(事件)世界

flink 复杂事件这篇博客文章试图总结CEP领域中的技术&#xff0c;并介绍它们的主要功能和不足。 有时似乎过度使用了CEP一词&#xff08;就像ESB一样&#xff09;&#xff0c;下面的内容反映了我们对它的理解和理解。 ESPER&#xff08; http://esper.codehaus.org/ &#xff0…

设计模式(中介者模式-对象去耦)

声明&#xff1a;本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

java flash截图_求大神们帮助, 如何在java中实现文字数据转换成图片或flash显示

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{response.setContentType("image/jpeg");createImage(response.getOutputStream());} private …

Spring Cloud Sidecar –节点初始化

在上一篇博客文章中&#xff0c;我描述了Sidecar应用程序如何用于在Eureka中注册Cassandra节点&#xff0c;并且更普遍地可以用于在Eureka中注册任何非JVM应用程序。 在本文中&#xff0c;我将介绍应用程序如何查询Sidecar注册节点。 发现注册的节点–初始化后 如果在Bean初始…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击&#xff0c;攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击&#xff0c;请按照下面这些通用步骤操作&…

java传.net datetime_.net调java写的webService传过去的datetime,int等非string类型为null的问题...

使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题 收藏用C#.NET调用Java开发的WebService时&#xff0c;先在客户端封装的带有int属性的对象&#xff0c;当将该对象传到服务器端时&#xff0c;服务器端可以得到string类型的属性值&#xff0c;却不能…