首页 > 编程语言 >Java数据结构---顺序表

Java数据结构---顺序表

时间:2024-10-21 23:18:17浏览次数:3  
标签:顺序 Java int ArrayList pos als --- 数据结构 public

目录

一、线性表

二、顺序表

2.1、顺序表的定义

 2.2、顺序表的接口实现

三、ArrayList

3.1、 ArrayList简介

3.2、ArrayList的实现 

3.3、ArrayList实现的完整代码


一、线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。  

二、顺序表

2.1、顺序表的定义

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。  

 2.2、顺序表的接口实现

public interface List {
    // 新增元素,默认在数组最后新增
    public void add(int data);
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind);
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove);
    // 获取顺序表长度
    public int size();
    // 清空顺序表
    public void clear();
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display();
    //判断数组是否满了
    public boolean isFulled();
}

三、ArrayList

3.1、 ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口。 

 注意:

1. ArrayList是以泛型方式实现的,使用时必须要先实例化

2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问

3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的

4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList

6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

3.2、ArrayList的实现 

在实现顺序表之前,我们要先定义一个数组、一个整型变量和一个构造方法:

    public int[] als;
    public int usedSize;
    public MyArrayList() {
        this.als =new int[10];
    }

 

//新增一个元素,默认在数组最后新增
//新增一个元素,默认在数组最后新增
    @Override
    public void add(int data) {
        if(isFulled()){
            reSize();
        }
        als[usedSize]=data;
        usedSize++;
    }
//判断顺序表是否已满
//判断顺序表是否已满
    @Override
    public boolean isFulled() {
        return usedSize==als.length;
    }
    //若顺序表已满,进行扩容
    private void reSize(){
        als= Arrays.copyOf(als,2*als.length);
    }
//在pos位置新增元素data
//在pos位置新增元素data
    @Override
    public void add(int pos, int data) {
        if(pos<=usedSize&&pos>=0){
            if(isFulled()){
                reSize();
            }
            for(int i=usedSize-1;i>=pos;i--){
                als[i+1]=als[i];
            }
            als[pos]=data;
            usedSize++;
        }else{
            throw new PosOutOfException("数据不合法");//该异常为我自身设定,各位使用时需另外设定
        }
    }

 异常设置的代码:

public class PosOutOfException extends RuntimeException{
    public PosOutOfException(String message) {
        super(message);
    }
}
//判断是否包含元素toFind
//判断是否包含元素toFind
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(als[i]==toFind){
                return true;
            }
        }
        return false;
    }
//查找某个元素对应的位置,如果未找到,返回-1
//查找某个元素对应的位置,如果未找到,返回-1
    @Override
    public int indexOf(int toFind) {
        int num=-1;
        for(int i=0;i<usedSize;i++){
            if(als[i]==toFind){
                num=i;
                break;
            }
        }
        return num;
    }
// 获取 pos 位置的元素
// 获取 pos 位置的元素
    @Override
    public int get(int pos) {
        if(pos>=0&&pos<usedSize){
            return als[pos];
        }else{
            throw new PosOutOfException("pos位置不合法");
        }
    }
// 给 pos 位置的元素设为 value
// 给 pos 位置的元素设为 value
    @Override
    public void set(int pos, int value) {
        if(pos>=0&&pos<usedSize){
            als[pos]=value;
        }else{
            throw new PosOutOfException("pos位置不合法");
        }
    }

 

//删除第一次出现的关键字toRemove
//删除第一次出现的关键字toRemove
    @Override
    public void remove(int toRemove) {
        int index=indexOf(toRemove);
        if(index==-1){
            return;
        }
        for(int i=index;i<usedSize-1;i++){
            als[i]=als[i+1];
        }
        usedSize--;
    }
// 获取顺序表长度
// 获取顺序表长度
    @Override
    public int size() {
        return this.usedSize;
    }
// 清空顺序表
// 清空顺序表
    @Override
    public void clear() {
        usedSize=0;
    }
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    @Override
    public void display() {
        for(int i=0;i<usedSize;i++){
            System.out.print(als[i]+" ");
        }
    }

注意:调用方法时用“.”来调用,以下以display()为例:

 

public class Main {
    public static void main(String[] args) {
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(66);
        myArrayList.display();
    }
}

结果如下:

 

 

3.3、ArrayList实现的完整代码

import java.util.Arrays;

public class MyArrayList implements List{
    public int[] als;
    public int usedSize;
    public MyArrayList() {
        this.als =new int[10];
    }
    //新增一个元素,默认在数组最后新增
    @Override
    public void add(int data) {
        if(isFulled()){
            reSize();
        }
        als[usedSize]=data;
        usedSize++;
    }
    //判断顺序表是否已满
    @Override
    public boolean isFulled() {
        return usedSize==als.length;
    }
    //若顺序表已满,进行扩容
    private void reSize(){
        als= Arrays.copyOf(als,2*als.length);
    }
    //在pos位置新增元素data
    @Override
    public void add(int pos, int data) {
        if(pos<=usedSize&&pos>=0){
            if(isFulled()){
                reSize();
            }
            for(int i=usedSize-1;i>=pos;i--){
                als[i+1]=als[i];
            }
            als[pos]=data;
            usedSize++;
        }else{
            throw new PosOutOfException("数据不合法");//该异常为我自身设定,各位使用时需另外设定
        }
    }
    //判断是否包含元素toFind
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(als[i]==toFind){
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置,如果未找到,返回-1
    @Override
    public int indexOf(int toFind) {
        int num=-1;
        for(int i=0;i<usedSize;i++){
            if(als[i]==toFind){
                num=i;
                break;
            }
        }
        return num;
    }
    // 获取 pos 位置的元素
    @Override
    public int get(int pos) {
        if(pos>=0&&pos<usedSize){
            return als[pos];
        }else{
            throw new PosOutOfException("pos位置不合法");
        }
    }
    // 给 pos 位置的元素设为 value
    @Override
    public void set(int pos, int value) {
        if(pos>=0&&pos<usedSize){
            als[pos]=value;
        }else{
            throw new PosOutOfException("pos位置不合法");
        }
    }
    //删除第一次出现的关键字toRemove
    @Override
    public void remove(int toRemove) {
        int index=indexOf(toRemove);
        if(index==-1){
            return;
        }
        for(int i=index;i<usedSize-1;i++){
            als[i]=als[i+1];
        }
        usedSize--;
    }
    // 获取顺序表长度
    @Override
    public int size() {
        return this.usedSize;
    }
    // 清空顺序表
    @Override
    public void clear() {
        usedSize=0;
    }
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    @Override
    public void display() {
        for(int i=0;i<usedSize;i++){
            System.out.print(als[i]+" ");
        }
    }
}

 以上便是本篇文章的全部内容,感谢大家的支持!下期见~~~

 

 

 

 

 

 

 

标签:顺序,Java,int,ArrayList,pos,als,---,数据结构,public
From: https://blog.csdn.net/huangtiandi11/article/details/143105241

相关文章

  • 考研数据结构-栈
    (一)、栈的基本概念     栈是一种只能在一端进行插入或者删除操作的线性表。允许插入或者删除的一端称为栈顶。栈顶由一个称为栈顶指针的位置指示器(是一个变量,对于顺序栈,就是记录栈顶元素所在数组位置符号的一个整型变量;对于链式栈,就是记录栈顶元素所在结点地址的指......
  • Z-Library官方入口国内可用网址(2024更新中)
    zlibrary数字图书馆介绍Z-library被称为全球最大的数字图书馆,里面包含9,826,996本电子书,84,837,646篇期刊文章。从各种知名文学著作,理工学科,人文艺术、到学术论文等应有尽有!支持PDF、epub、mobi等多种格式图书资源下载绝对是你找书的不二选择。zlibrary数字图书馆镜像网......
  • 2024/10/21 日 日志 --》关于Mysql中的数据库连接池 简述笔记整理
    为了保证博客内容的连贯性,我决定把Maven内容单独开辟而不与JDBC相混。以下为数据库连接池的简单描述和笔记整理点击查看代码--数据库连接池--简介:--·数据库连接池是个容器,负责分配、管理数据库连接。--·它允许应用程序重复使用一个现有的数据库连接,而不是再重新建......
  • 2024-10-21 闲话
    高考后来参加南开强基的校测,教室里面只有她非常清秀。也可能清秀的不是她,我的记忆全都错乱了。可能是她的话故事可以拉得更长,虽然即使这个不是她,故事也可以很长。另一种情况,这个是她,故事也可以很短。这人究竟是不是她可能重要,可能不重要。其实之前脑袋里面只有一个印象,这段时间试......
  • K8s - Helm的使用
    安装Helmhttps://helm.sh/zh/docs/https://github.com/helm/helm/releaseshttps://get.helm.sh/helm-v3.16.2-linux-amd64.tar.gz在master节点安装Helm[root@k8s-master~]#tar-xvzfhelm-v3.16.2-linux-amd64.tar.gzlinux-amd64/linux-amd64/LICENSElinux-amd64/h......
  • 东山Pi柒号-主板简介
    东山Pi柒号-开发板最近淘到了一块性价比还不错的开发板,东山派柒号。出自韦东山店,使用芯片STM32MP157,正好学习一下。板子文档链接:DongshanPIBoardDocumentationCenter.以下是摘自该网站的一些信息:硬件功能描述核心板规格SOC主控:STM32MP157DAC(双核CorteXA7800Mhz+......
  • (multi)map和set--C++
    文章目录一、序列式容器和关联式容器二、set系列的使用1、set和multiset参考文档2、set类的介绍3、set的构造和迭代器4、set的增删查5、insert和迭代器遍历使用样例:6、find和erase使用样例:7、multiset和set的差异三、map系列的使用1、map和multimap参考文档2、map类的介......
  • 20222401 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    1实验内容1.1实践基本知识1.1.1后门后门就是不经过正常认证流程而访问系统的通道。最早的后门并不是恶意的,而是开发人员为了便于在开发期间调试程序而设置的快捷路径。按照存在位置进行分类,可以分为以下4类:编译器后门操作系统后门应用程序后门伪装成正常程序的后门1.......
  • PAT (Basic Level)--1002写出这个数
    读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。输入样......
  • 【Javaee】网络编程-TCP Socket
    前言前文中我们介绍了UDPSocket相关的构造方法和方法,并实现了UDP的回显服务器和客户端。本篇将介绍TCPSocket,并使用TCPSocketapi实现服务器和客户端的通信一.TCPSocket的常见方法1.ServerSocketServerSocket是创建TCP服务端Socket的API1)ServerSocket构造方法方......