Java数据结构的大门——顺序表

目录

线性表

顺序存储:

链式存储:

顺序表

顺序表的模拟实现

新增元素

删除元素

修改元素

查找元素

获取顺序表的长度

清空顺序表


线性表

具有相同特性数据元素的有限序列,称为线性表,数组就是一种的线性表。

常见的线性表有:顺序表,链表,栈,队列等等。

你可以把线性表在逻辑上想象成一条直线,也就是线性结构,但是在具体使用线性表的时候,并不一定在一条直线上面,也就是说线性表的物理结构不一定是连续的。

线性结构的存储方式有两种,顺序存储和链式存储。通常以数组和链式结构的形式进行存储。

顺序存储:

在逻辑上是一条直线,是连续的,物理结构上也是一条直线,也是连续的。

链式存储:

逻辑上是一条直线,但是物理结构上并不是连续存储的。

顺序表

顺序表是线性表中的一种,是用一段地址连续的空间来存储数据的线性结构。

是不是和数组的定义有点相似了,没错,顺序表就是使用数组来对数据进行增删改查的。

顺序表的模拟实现

class Onder{
    public int[] elem;  //数组 实现顺序表
    public int useSize;  //有效元素的个数
    public static final int DEFAULT_UseSize = 5; 
    public onder() {
        this.elem = new int[DEFAULT_UseSize];
    }
}

当我们调用Onder的无参构造器的时候,系统会为我们构建好一个能存储5个int类型的数据空间。

也就是说将顺序表的底层容量设置为DEFAULT_UseSize。

新增元素

现在的顺序表中是没有任何数据中,我们此时就需要对顺序表进行新增元素的操作。

在顺序表的最后新增元素:

/**
     * 判断顺序表是否已满
     * @return
     */
    public boolean IsFull() {
        return this.elem.length == this.useSize;
    }
    /**
     * 在顺序表的最后新增元素
     * @param val
     */
    public void add(int val) {
        //先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
        if(IsFull()) {
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[useSize++] = val;
    }

在pos位置新增元素:

/**
     * 检查pos位置是否合法
     * @param pos
     * @return
     */
    public boolean index(int pos) {
        return pos >= 0 && pos < this.useSize;
    }
    /**
     * 在pos位置新增元素
     * @param pos
     * @param val
     */
    public void add(int pos,int val) {
        //先判断整个顺序表是否已满,如果已满,则需对顺序表进行扩容
        if(IsFull()) {
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //再判断pos位置是否合法
        if(index(pos)) {
            for (int i = this.elem.length-1; i > pos; i--) {
                this.elem[i] = this.elem[i-1];
            }
            this.elem[pos] = val;
            this.useSize++;

        } else {
            System.out.println("pos位置不合法,请检查合法性");
        }

    }

删除元素

删除第一次出现的关键字key

/**
     * 删除第一次出现的关键字key
     * @param key
     */
    public void remove(int key) {
        for (int i = 0; i < this.useSize-1; i++) {
            if(this.elem[i] == key) {
                for (int j = i; j < this.useSize-1; j++) {
                    this.elem[j] = this.elem[j+1];
                }
                this.useSize--;
                this.elem[useSize] = 0;   //最后一个元素置为0
                return;
            }
        }
        System.out.println("没有你要删除的关键字");
    }

修改元素:

将pos位置的元素修改为val

    /**
     * 将pos位置的值改为val
     * @param pos
     * @param val
     */
    public void set(int pos,int val) {
        if(pos>=0 && pos< this.useSize) {
            this.elem[pos] = val;
            return;
        }
        System.out.println("pos位置不合法");
    }

 查找元素:

查找某个元素对应的位置

    /**
     * 查找某个元素对应的位置
     * @param val
     * @return
     */
    public int indexOf(int val) {
        for (int i = 0; i < this.useSize-1; i++) {
            if(this.elem[i] == val) {
                return i;
            }
        }
        return -1;
    }

获取pos位置的元素

    /**
     * 获取pos位置的值
     * @param pos
     * @return
     */
    public int get(int pos) {
        if(pos>=0 && pos< this.useSize) {
            return this.elem[pos];
        }
        return -1;
    }

判断是否包含某个元素 

    /**
     * 判断是否包含某个元素的值
     * @param val
     * @return
     */
    public boolean contains(int val) {
        for (int i = 0; i < this.useSize-1; i++) {
            if(this.elem[i] == val) {
                return true;
            }
        }
        return false;
    }

获取顺序表的长度

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

清空顺序表

    /**
     * 清空顺序表
     */
    public void clear() {
        this.useSize = 0;  //如果顺序表中存放的是引用类型,则需要将每一个元素全部置为null
    }

猜你喜欢

转载自blog.csdn.net/qq_63525426/article/details/128679769