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;应用程序设计演变为更多的基于流程或任务的设计模型…

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

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

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

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

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

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

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…

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

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

windows服务器的DDOS防御,

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

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中&#xff0c;我谈到了需要像Netflix Hystrix这样的库的动机。 在这里&#xff0c;我将跳入一些非常基本的方法来开始使用Hystrix&#xff0c;并在更复杂的用例中进行后续介绍。 你好&#xff0c;世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号&#xff0c;而你需要把它们传输到服务器&#xff0c;这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中&#xff0c;这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

ssh图片上传 java_ssh上传并显示图片

struts部分&#xff1a;attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

使用JUnit规则进行干净的集成测试

JUnit Rules的优势&#xff0c;尤其是在进行集成测试时&#xff0c;几乎不能被高估。 在本文中&#xff0c;我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下&#xff0c;这些简化了灯具控制。 作为示例&#xff0c;我们将看看如何基于…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另&#xff1a;B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点&#xff1a; 不需要联网也可以打开使用部分功能&#xff0c;但是现在的情况是许多功能依然需要互联网的支持&#xff0c;代码部分在用户电脑上执行 使用…

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…