当前位置: 首页 > article >正文

数据结构《顺序表》

文章目录

  • 前言
  • 一、什么是顺序表?
    • 1.1 顺序表的概念
    • 1.2 顺序表的建立
  • 二、MyArrayList的实现
  • 三、顺序表的方法
  • 四、关于顺序表的例子
  • 总结


前言

提示:这里涉及到的ArrayList类是一个泛型类,同时后面的很多内容都会涉及到泛型,如果不了解泛型,可以在我给出的链接中查看了解一下,比较简单>>JAVA泛型<<


一、什么是顺序表?

1.1 顺序表的概念

概念的内容来源于>>ArrayList
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素

它的本质就是一个数组。只不过这个数组在容量达到上限后会自动将数组进行扩容,但是,不是在同一个数组上而是返回一个扩容后的新数组,将原来数组上的内容复制到新的数组上,给我们一种直接扩容的感觉
在这里插入图片描述

在这里插入图片描述

1.2 顺序表的建立

import java.util.ArrayList; // 引入 ArrayList 类

ArrayList<E> objectName = new ArrayList<>();  // 初始化

在这里插入图片描述
补充内容
在这里插入图片描述
我当时想直接用original这个对象进行clone发现是不行的,List是个接口,不是个类,没有实现Cloneable接口,无法克隆。
同时Array.asList,这个方法返回的是一个固定的视图,
当我们想在这个对象中加数据时我们会发现
在这里插入图片描述
这是为什么呢?
解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Arrays.asList(1, 2, 3)返回的是一个java.util.Arrays.ArrayList类型的对象,它并不是java.util.ArrayList类型。虽然它们都实现了List接口,但不能直接进行强制类型转换。同时因为它们都实现了List接口,所以,以List 为类型的引用可以接收Arrays.asList的返回值
在这里插入图片描述

二、MyArrayList的实现

将需要实现的方法放在一个接口中,在通过自定义类实现这个接口

public interface IList {
    // 新增元素,默认在数组最后新增
    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();
}

自定义的顺序表

import java.util.Arrays;

public class MyArrayList implements IList{
    public int[] array;
    private static final int DEFAULT_CAPACITY = 10;
    public MyArrayList(){
        this.array = new int[DEFAULT_CAPACITY];
    }
    private int useSide;

    //判断数组是否满了
    private boolean isFull(int[] array){
        if(array.length == DEFAULT_CAPACITY){
            //如果长度等于初始容量,说明数组满了
            return true;
        }
        return false;
    }
    //扩容数组
    private int[] grow(int[] array){
        return Arrays.copyOf(this.array,array.length*2);
    }
    @Override
    // 新增元素,默认在数组最后新增
    public void add(int data) {
        if (isFull(this.array)){
            this.array = grow(this.array);
        }
        array[useSide] = data;
        useSide++;
    }

    //判断pos是否正确
    private void checkpos(int pos){
        try {
            if(pos < 0 || pos > this.useSide){
                throw new OutOfArrayException("越界异常");
            }
        }catch (OutOfArrayException e){
            e.printStackTrace();
        }
    }
    @Override
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        try {
            checkpos(pos);
            if (isFull(this.array)){
                this.array = grow(this.array);
            }
            for (int i = this.useSide - 1; i >= pos; i--) {
                array[i+1] = array[i];
            }
            array[pos] = data;
            this.useSide++;
        }catch (OutOfArrayException e){
            e.printStackTrace();
        }
    }

    @Override
    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.useSide; i++) {
            if(toFind == this.array[i]){
                return true;
            }
        }
        return false;
    }

    @Override
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.useSide; i++) {
            if(toFind == this.array[i]){
                return i;
            }
        }
        return -1;
    }

    private void isEmpty(int[] array){
        if(empty(array)){
            throw new IsEmptyException("空数组越界访问");
        }
    }
    private boolean empty(int[] array){
        return array.length == 0;
    }
    @Override
    // 获取 pos 位置的元素
    public int get(int pos) {
        try {
            checkpos(pos);
            isEmpty(this.array);
            return this.array[pos];
        }catch (OutOfArrayException | IsEmptyException e){
            e.printStackTrace();
        }
        return -1;
    }

    @Override
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        try {
            checkpos(pos);
            isEmpty(this.array);
            array[pos] = value;
        }catch (OutOfArrayException | IsEmptyException e){
            e.printStackTrace();
        }
    }

    @Override
    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        try {
            isEmpty(this.array);
            int m = indexOf(toRemove);
            for (int i = m; i < this.useSide - 1; i++) {
                array[i] = array[i+1];
            }
            this.useSide--;
        }catch (IsEmptyException e){
            e.printStackTrace();
        }
    }

    @Override
    // 获取顺序表长度
    public int size() {
        return this.useSide;
    }

    @Override
    // 清空顺序表
    public void clear() {
        this.useSide = 0;
    }

    @Override
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() {
        for (int i = 0; i < this.useSide; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

自定义的异常OutOfArrayException,超出数组范围

public class OutOfArrayException extends RuntimeException{
    public OutOfArrayException(){
        super();
    }
    public OutOfArrayException(String m){
        super(m);
    }
}

自定义异常,数组为空

public class IsEmptyException extends RuntimeException{
    public IsEmptyException(){
        super();
    }
    public IsEmptyException(String m){
        super(m);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(10);
        myArrayList.add(10);
        myArrayList.add(2,99);
        myArrayList.add(10);
        myArrayList.add(10);
        myArrayList.display();
        System.out.println(myArrayList.get(2));
        System.out.println(myArrayList.indexOf(10));
    }
}

三、顺序表的方法

在这里插入图片描述

四、关于顺序表的例子

题目来源>>杨辉三角<<
在这里插入图片描述

public class Test {
    public static List<List<Integer>> generate(int numRows) {
        if(numRows <= 0){
            return null;
        }
        List<List<Integer>> array = new ArrayList<>();
        for(int i = 0;i < numRows;i++){
            array.add(new ArrayList<>());
        }
        array.get(0).add(1);
        for(int i = 1 ; i < numRows ;i++){
            array.get(i).add(1);
            for(int j = 1; j < i; j++){
                array.get(i).add(array.get(i-1).get(j)+array.get(i-1).get(j-1));
            }
            array.get(i).add(1);
        }
        return array;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int s = scanner.nextInt();
        List<List<Integer>> array = generate(s);
        for (int i = 0; i < s; i++) {
            System.out.println(array.get(i));
        }
    }
}

在这里插入图片描述

总结

本篇文章,介绍了有关顺序表的内容,包括什么是顺序表、如何实现自己的顺序表、以及使用顺序表解决问题的例子。


http://www.kler.cn/news/362577.html

相关文章:

  • 力扣71~75题
  • 【ROS2】Qt和ROS混合编程:多继承QObject和rclcpp::Node
  • std::atomic有什么用法
  • 基于DSP设计的多通道DC/DC数字电源系统
  • 使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试
  • ubuntu 开启haproxy UI
  • 通过微信小程序实现对接企业微信客服
  • 【Java Script引擎有哪些】
  • JavaWeb合集11-Maven高级
  • MySQL 的意向锁(Intention Locks)原理详解
  • Flink 状态精准一次性特性
  • 线性可分支持向量机的原理推导【补充知识部分】9-10最大化函数max α,β L(x,α,β)关于x的函数 公式解析
  • C++——NetWork
  • Mac 使用 zsh 终端提示 zsh: killed 的问题
  • 微信小程序设置弹框底下内容不能移动 滚动(滚动穿透问题)
  • 【鼠鼠学AI代码合集#8】线性神经网络
  • Vue封装组件并发布到npm仓库
  • 【ROS2】Qt和ROS混合编程:多继承QObject和rclcpp::Node
  • LRU算法
  • ATmega128定时器里面的定时器和外部中断配置
  • ElasticSearch基本概念
  • 微软主动出击,“钓”出网络钓鱼者
  • 关于在ubuntu服务器上无法守护长链接命令的问题
  • 自动化数据库管理:如何通过存储过程动态创建 MySQL 对象
  • Python中的字符串修剪:strip()、lstrip() 和 rstrip()
  • 1U服务器和Hyper-V虚拟机使用记录