首页 > 其他分享 >使用数组实现一个线性表

使用数组实现一个线性表

时间:2024-03-05 21:45:44浏览次数:15  
标签:index return 线性表 实现 listArray int 数组 public

线性表的存储结构

顺序表:静态存储分配,编译时确定容量(相当于数组, 如Java new int [5]),用一段地址连续的存储单元依此存储线性表的数据元素

如何实现一个线性表

方法接口

对于线性表中一些常用的方法,这些方法是线性表中经常使用的

public interface ListMethods<T> {
    void clear(); // 清空线性表
    boolean isEmpty(); // 判断线性表是否为空
    int length(); // 返回线性表的长度
    T get(int i); // 获取指定位置的元素
    void insert(T t); // 向线性表中添加元素t 
    void insert(int i, T t); // 在i元素处插入元素t
    T remove(int i); // 删除线性表中下标为i的元素
    int indexOf(T t); // 查找元素t是否在线性表中,如果在则返回下标
}

使用数组方式实现

首先我们创建一个类, 先给线性表定一个数组

public class SequenceList<T> implements ListMethods<T> {
    private T[] listArray; // 用来存储数据
    private int N;	// 记录存储数据个数

    /**
     * 初始化方法
     * @param capacity
     */
    public SequenceList(int capacity) {
        // 泛型是不能够实例化的,我们可以先使用Object类型在进行类型转换
        listArray = (T[]) new Object[capacity];
        N = 0;
    }
}

清空线性表

    /**
     * 清空线性表
     */
    public void clear() {
        this.N = 0;
    }

判断线性表是否为空

    /**
     * 判断线性表是否为空
     * @return
     */
    public boolean isEmpty() {
        return N == 0;
    }

返回线性表的长度

    /**
     * 返回线性表的长度
     * @return
     */
    public int length() {
        return N;
    }

获取指定位置的元素

    /**
     * 获取指定位置的元素
     * @param i
     * @return
     */
    public T get(int i) {
        return listArray[i];
    }

向线性表中添加元素t

    /**
     * 向线性表中添加元素t
     * @param t
     */
    public void insert(T t) {
        // 判断 N 是否等于数组长度,如果等于那么我们对原有的数组长度进行扩容
        if (N == listArray.length) {
            resize(listArray.length * 2);
        }
        listArray[N++] = t;
    }

    /**
     * 根据参数newSize,重置listArray的大小
     * @param newSize
     */
    public void resize(int newSize) {
        // 定义一个临时数组,指向原数组
        T[] temp = listArray;
        // 创建新数组
        listArray = (T[]) new Object[newSize];
        // 把原数组的数据拷贝到新数组
        for (int i = 0; i < N; i++) {
            listArray[i] = temp[i];
        }
    }

在i元素处插入元素t

    /**
     * 在i元素处插入元素t
     * @param i 索引
     * @param t 元素
     */
    public void insert(int i, T t) {
        if (N == listArray.length) {
            resize(listArray.length * 2);
        }
        for (int index = N; index > i; index--) {
            listArray[index] = listArray[index - 1];
        }
        listArray[i] = t;
        N++;
    }

删除线性表中下标为i的元素

    /**
     * 删除线性表中下标为i的元素
     *
     * @param i 索引
     * @return
     */
    public T remove(int i) {
        T current = listArray[i];
        for (int index = i; index < N - 1; index++) {
            listArray[index] = listArray[index + 1];
        }
        N--;
        // 如果N小于listArray长度四分之一那么将listArray长度减半
        if (N < listArray.length / 4) {
            resize(listArray.length / 2);
        }

        return current;
    }

查找元素t是否在线性表中,如果在则返回下标

    /**
     * 查找元素t是否在线性表中,如果在则返回下标
     * @param t
     * @return
     */
    public int indexOf(T t) {
        for (int i = 0; i < N; i++) {
            if (listArray[i].equals(t)) {
                return i;
            }
        }
        return -1;
    }

顺序表的遍历

public class SequenceList<T> implements Iterable<T>, ListMethods<T>{

    /**
     * 顺序表的遍历
     * @return
     */
    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator {
        private int cusor;

        public SIterator() {
            this.cusor = 0;
        }

        @Override
        public boolean hasNext() {
            return cusor < N;
        }

        @Override
        public Object next() {
            return listArray[cusor++];
        }
    }
}

完整代码

package DataStrues.ListTable;

import java.util.Iterator;

public class SequenceList<T> implements Iterable<T>, ListMethods<T> {
    private T[] listArray;
    private int N;

    /**
     * 初始化方法
     * @param capacity
     */
    public SequenceList(int capacity) {
        // 泛型是不能够实例化的,我们可以先使用Object类型在进行类型转换
        listArray = (T[]) new Object[capacity];
        N = 0;
    }

    /**
     * 清空线性表
     */
    public void clear() {
        this.N = 0;
    }

    /**
     * 判断线性表是否为空
     * @return
     */
    public boolean isEmpty() {
        return N == 0;
    }

    /**
     * 返回线性表的长度
     * @return
     */
    public int length() {
        return N;
    }

    /**
     * 获取指定位置的元素
     * @param i
     * @return
     */
    public T get(int i) {
        return listArray[i];
    }

    /**
     * 向线性表中添加元素t
     * @param t
     */
    public void insert(T t) {
        if (N == listArray.length) {
            resize(listArray.length * 2);
        }
        listArray[N++] = t;
    }

    /**
     * 在i元素处插入元素t
     * @param i 索引
     * @param t 元素
     */
    public void insert(int i, T t) {
        if (N == listArray.length) {
            resize(listArray.length * 2);
        }
        for (int index = N; index > i; index--) {
            listArray[index] = listArray[index - 1];
        }
        listArray[i] = t;
        N++;
    }

    /**
     * 删除线性表中下标为i的元素
     *
     * @param i 索引
     * @return
     */
    public T remove(int i) {
        T current = listArray[i];
        for (int index = i; index < N - 1; index++) {
            listArray[index] = listArray[index + 1];
        }
        N--;
        // 如果N小于listArray长度四分之一那么将listArray长度减半
        if (N < listArray.length / 4) {
            resize(listArray.length / 2);
        }

        return current;
    }

    /**
     * 查找元素t是否在线性表中,如果在则返回下标
     * @param t
     * @return
     */
    public int indexOf(T t) {
        for (int i = 0; i < N; i++) {
            if (listArray[i].equals(t)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 根据参数newSize,重置listArray的大小
     * @param newSize
     */
    public void resize(int newSize) {
        // 定义一个临时数组,指向原数组
        T[] temp = listArray;
        // 创建新数组
        listArray = (T[]) new Object[newSize];
        // 把原数组的数据拷贝到新数组
        for (int i = 0; i < N; i++) {
            listArray[i] = temp[i];
        }
    }

    /**
     * 顺序表的遍历
     * @return
     */
    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    private class SIterator implements Iterator {
        private int cusor;

        public SIterator() {
            this.cusor = 0;
        }

        @Override
        public boolean hasNext() {
            return cusor < N;
        }

        @Override
        public Object next() {
            return listArray[cusor++];
        }
    }
}

标签:index,return,线性表,实现,listArray,int,数组,public
From: https://www.cnblogs.com/lymf/p/18055035

相关文章

  • Mapbox实战项目(1)-栅格图片图层实现地图方位展示
    需求背景需要实现地图上展示一个类似于罗盘的标记,随着地图的缩放、切换、旋转等,能够在地图的中央指示出地图的方位。系统自带的方位控件太小,在特殊业务场景下不够醒目。技术选型Mapbox实现分析官网已经有地图上展示图片矢量图层的demo,“Addarasterimagetoamaplayer......
  • js 数组筛选方法使用整理_JavaScript常用数组元素搜索或过滤
    一、常用方案介绍:如果你想找到在符合特定条件的阵列中的所有项目,使用filter。如果你想检查是否至少有一个项目符合特定的条件,请使用find。如果你想检查一个数组包含一个特定的值,请使用includes。如果要在数组中查找特定项目的索引,请使用indexOf 二、js数组筛选方法......
  • 21. 实现洗牌逻辑
    洗牌方法洗牌的时候,会把弃牌堆清除,牌堆中的每张牌都会和随机的牌进行交换一共有两个地方会进行洗牌操作,第一个是初始化牌堆的时候第二个是抽牌堆为空的时候项目相关代码代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git标签:20240305_1905......
  • arm A64 local_irq_disable/local_irq_save实现
    Linux很多地方会使用local_irq_disable/local_irq_save函数,那么不同CPU架构,有不同的实现方式,arm64又是怎么实现的呢?下面是spin_lock_irqsave的代码调用层次关系:->spin_lock_irqsave/*include/linux/spinlock.h*/->raw_spin_lock_irqsave/*include/linux/spinlo......
  • Nuxt3-pinia环境下实现数据持久化
    Nuxt3-pinia环境下实现数据持久化1、安装yarnaddpinia@pinia/nuxt然后进行配置,修改nuxt.config.tsexportdefaultdefineNuxtConfig({devtools:{enabled:false},typescript:{shim:false},modules:['@pinia/nuxt',//+'@pinia-plugi......
  • 一、jsPlumb实现流程图配置--jsPlumb介绍
    jsPlumb是一个前端库,用来实现类似MicrosoftVisio的Web端流程图,可以实现拖拽节点,连线,填充文案等方式生成一个流程图。jsPlumb有两个版本,一个是商业版需要收费,另一个是社区版开源免费。目前社区版的最新的文档地址一、jsPlumb中的基本概念节点(Node)节点就是流程图中可以连线或......
  • 在IDEA中实现热部署
    什么是热部署?热部署(HotDeployment)是指在应用程序运行过程中,无需停止整个应用程序或重新启动服务器,就能够部署新的代码、资源或配置文件,使其立即生效。这种部署方式有助于提高开发效率和系统的可用性。有了热部署之后,当修改了代码的某部分,无需重新启动项目,就能把增量的内容自动......
  • day56 动态规划part13 代码随想录算法训练营 718. 最长重复子数组
    题目:718.最长重复子数组我的感悟:有难度,不好想。理解难点:二维DP,记住那个图:===============听课笔记:我的代码:classSolution:deffindLength(self,nums1:List[int],nums2:List[int])->int:#初始化#假设内层是nums1,n,j,外层是nums2,m,......
  • ant loading效果实现
    1<!DOCTYPEhtml>2<html>3<head>4<metacharset="utf-8">5<title></title>6<styletype="text/css">7.dot{8display:flex......
  • 在Windows操作系统上进行端口映射通常需要使用网络地址转换(NAT)规则或端口转发来实现。
    端口映射通常与目的网络地址转换(DNAT)概念相关联。在网络中,DNAT是一种技术,用于将传入的数据包的目的IP地址和/或端口号修改为内部网络中另一台计算机的IP地址和端口号。这样可以实现将外部流量导向内部特定计算机或服务的功能。因此,端口映射通常涉及DNAT技术,用于在网络中重......