线性表的顺序存储结构之顺序表类的实现_Java

时间:2023-01-10 07:53:29

在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类。

首先让我们来看下顺序表的定义:

线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻。顺序存储的线性表也成为顺序表(sequential list)。

顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,table是一个存放元素的对象数组;n为线性表长度,n≤table.length。SeqList声明如下,它实现了线性表的接口LList。

package dataStructure.linearList;  
import dataStructure.linearList.LList;  
  
public class SeqList<E> implements LList<E>                 //顺序表类,实现线性表接口  
{  
    private Object[] table;                                 //对象数组,私有成员  
    private int n;                                          //顺序表长度  
      
    public SeqList(int capacity)                            //构造方法,创建置顶容量的空表  
    {  
        this.table = new Object[Math.abs(capacity)];  
        this.n = 0;  
    }  
      
    public SeqList()                                        //指定空表的默认容量  
    {  
        this(16);  
    }  
      
    public boolean isEmpty()                                //判断顺序表是否为空,若空返回true  
    {  
        return this.n == 0;  
    }  
      
    public int length()                                     //返回顺序表长度  
    {  
        return this.n;  
    }  
      
    public E get(int index)                                 //返回index(初值为0)位置的对象,若序号无效,返回null  
    {  
        if(index>=0 && index < this.n)  
        {  
            return (E)this.table[index];  
        }  
        return null;  
    }  
      
    public E set(int index,E element)                       //设置index位置的对象为element,若操作成功,放回原对象,否则返回null  
    {  
        if(index >= 0 && index < this.n && element != null)  
        {  
            E old =(E)this.table[index];  
            this.table[index] = element;  
            return old;  
        }  
        return null;  
    }  
      
    public boolean add(int index,E element)                 //在index位置插入element对象,若操作成功返回true,不能插入null  
    {  
        if(element == null)                                 //不能插入null  
        {  
            return false;  
        }  
        if(this.n == table.length)                          //若数组满,则需要扩充顺序表容量  
        {  
            Object[] temp = this.table;  
            this.table = new Object[temp.length*2];         //重新申请一个容量更大的数组  
            for(int i = 0;i < temp.length;i++)  
            {  
                this.table[i] = temp[i];  
            }  
        }  
          
        if(index < 0)                                        //下标容错  
        {  
            index = 0;  
        }  
        if(index > this.n)  
        {  
            index =this.n;  
        }  
        for(int j = this.n-1;j >= index;j--)             //元素后移,平均移动n/2  
        {  
            this.table[j+1] = this.table[j];  
        }  
        this.table[index] = element;  
        this.n++;  
        return true;  
    }  
      
    public boolean add(E element)                           //在顺序表最后插入element对象  
    {  
        return add(this.n,element);  
    }  
      
    public E remove(int index)                              //移去index位置的对象,若操作成功,则返回被移去的对象,否者返回null  
    {  
        if(this.n != 0 && index >= 0 && index < this.n)  
        {  
            E old = (E)this.table[index];  
            for(int j = index;j < this.n-1;j++)              //元素前移,平均移动n/2  
            {  
                this.table[j] = this.table[j + 1];  
            }  
            this.table[this.n - 1] = null;  
            this.n--;  
            return old;  
        }  
        return null;  
    }  
      
    public void clear()                                     //清空顺序表  
    {  
        if(this.n != 0)  
        {  
            for(int i = 0;i < this.n;i++)  
            {  
                this.table[i] = null;  
            }  
            this.n=0;  
        }  
    }  
    public String toString()                                //返回显示所有元素的字符串,形式为(,)  
    {  
        String str = "(";  
        if(this.n != 0)  
        {  
            for(int i = 0;i < this.n - 1;i++)  
            {  
                str += this.table[i].toString()+",";  
            }  
            str += this.table[this.n - 1].toString();  
        }  
        return str + ")";  
    }  
}  

顺序表是一种随即存取结构,存取任何一个元素的get()、set()方法的时间复杂度是O(1)。

对顺序表进行插入或删除操作是,算法所花费的时间主要用于移动元素。在等概率情况下,插入一个元素平均需要移动一半的元素,时间复杂度为O(n)。同里,删除一个元素的时间复杂度亦为O(n)。

综上所述,顺序表具有下列特点:

①:元素的物理存储顺序直接反映表中元素的逻辑顺序,可以随机存取元素。

②:插入和删除的操作效率很低。每插入或删除一个元素,可能需要移动大量元素,其平均移动次数是顺序表长度的一半。再者,数组容量不可更改,存在因容量小造成数据溢出,或因容量过大造成内存资源浪费的问题。解决数据溢出的方法是,申请另一个更大容量的数组,并进行数组元素复制,但插入操作效率很低。 

顺序表是一种随即存取结构,存取任何一个元素的get()、set()方法的时间复杂度是O(1)。

对顺序表进行插入或删除操作是,算法所花费的时间主要用于移动元素。在等概率情况下,插入一个元素平均需要移动一半的元素,时间复杂度为O(n)。同里,删除一个元素的时间复杂度亦为O(n)。

综上所述,顺序表具有下列特点:

①:元素的物理存储顺序直接反映表中元素的逻辑顺序,可以随机存取元素。

②:插入和删除的操作效率很低。每插入或删除一个元素,可能需要移动大量元素,其平均移动次数是顺序表长度的一半。再者,数组容量不可更改,存在因容量小造成数据溢出,或因容量过大造成内存资源浪费的问题。解决数据溢出的方法是,申请另一个更大容量的数组,并进行数组元素复制,但插入操作效率很低。

线性表的顺序存储结构之顺序表类的实现_Java的更多相关文章

  1. c语言数据结构之线性表的顺序存储结构

    线性表,即线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构,简称线性表. 注意:使用线性表存储的数据,要求数据类型必须一致,线性表存储的数据,要么全不 ...

  2. 数据结构4&colon;顺序表&lpar;线性表的顺序存储结构&rpar;及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  3. 2&period;2&lowbar;线性表的顺序存储结构&lowbar;参考集合ArrayList

    [线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码 C语言版] #define MAXSIZE 20 /*存储空间初始分配量*/ typed ...

  4. 线性表的顺序存储结构——java

    线性表的顺序存储结构:是指用一组地址连续的存储单元一次存放线性表的元素.为了使用顺序结构实现线性表,程序通常会采用数组来保存线性中的元素,是一种随机存储的数据结构,适合随机访问.java中ArrayL ...

  5. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  6. C&plus;&plus;编程练习&lpar;1&rpar;----&OpenCurlyDoubleQuote;实现简单的线性表的顺序存储结构&OpenCurlyDoubleQuote;

    线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include&lt ...

  7. C&plus;&plus;实现线性表的顺序存储结构

    将线性表的抽象数据类型定义在顺序表存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制. 头文件seqlist.h #pragma once #include <iost ...

  8. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

  9. SDUT OJ 顺序表应用6:有序顺序表查询

    顺序表应用6:有序顺序表查询 Time Limit: 1000 ms Memory Limit: 4096 KiB Submit Statistic Discuss Problem Descripti ...

随机推荐

  1. AngularJs &dollar;interpolate 和 &dollar;parse

    $interpolate 将一个字符串编译成一个插值函数.HTML编译服务使用这个服务完成数据绑定. 使用:$interpolate(text,[mustHaveExpression],[truste ...

  2. load css use javascript

    var $ = document; // shortcut var cssId = 'myCss'; // you could encode the css path itself to genera ...

  3. python实现web分页日志查看

    当我们维护一个网站时,无论前台还是后台,经常会出现各种个样的问题.有时候问题很难直观的发现,这个时候只能查看各种日志来跟踪问题.但是查看日志有各种个样的问题.首先,要用各种工具登陆到服务器,这个有时候 ...

  4. AcmeAir安装AI探针--企业版

    通过脚本安装AI探针请点击通过脚本自动安装探针 一.安装企业版AI探针准备工作: 1. 准备好可用的docker版AcmeAir应用 2. 准备好可用的企业版AIServer 3. 下载好合适版本的J ...

  5. Android Audio Play Out Channel

    1: 7嘴8舌 扬声器, 耳机, 和听筒 就是通过: audiomanager.setmode(AudioManager.MODE_IN_COMMUNICATION)audiomanager.setS ...

  6. Python测试远程端口连接时间

    问题 最近自己服务器访问别人的服务器,有时候会报超时错误,有时候又能够正常访问别人服务器. 思路 最开始猜测是网络不稳定造成的,但是自己没有收集什么时候超时,什么时候能正常访问别人服务器的日志,搞网络 ...

  7. DLC 基本逻辑运算

    逻辑代数:分析设计数字电路的数学基础是逻辑代数 变量的取值只能是 0 1 逻辑代数中只有三种基本逻辑运算,即 与 或 非 与逻辑运算: 只有决定一件事情的全部条件都具备时,这事件才成立.这样的因果关系 ...

  8. Unity - Photon PUN 本地与网络同步的逻辑分离 (一)

    服务器大家可以使用Photon官网提供的,这样会变得很简单,直接搭建下就好.或者下载到本地开启本地端Photon服务器 (大家也可以使用和我一样方式有时间做了个winform 程序用来管理本地服务器开 ...

  9. 机器学习理论基础学习3&period;1--- Linear classification 线性分类之感知机PLA(Percetron Learning Algorithm)

    一.感知机(Perception) 1.1 原理: 感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型. 假设训练数据集是线性可分的,感知机学习的目标 ...

  10. DataType 数据类型

    基本类型:四类八种:数值 : 整数:byte,short,int,long.默认是 int 小数:float,double                  默认是 double 布尔:boolean ...