Java数据结构之顺序表

一、对顺序表的简单了解和思路分析

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

思路分析:
顺序表相对比较简单,操作也相对容易,即就是在数组上进行对应的增、删、查、改,稍加画图就很容易理解。

二、代码实现

在实现代码内容前首先需要一个总体的实现框架,如下:

public class SeqList { 
// 打印顺序表
public void display() { 
} 
// 新增元素,默认在数组最后新增
public void add(int data) { 
} 
// 在 pos 位置新增元素
public void add(int pos, int data) { 
} 
// 判定是否包含某个元素
public boolean contains(int toFind) { 
return true; 
} 
// 查找某个元素对应的位置
public int indexOf(int toFind) { 
return -1; 
} 
// 获取 pos 位置的元素
public int get(int pos) { 
return -1; 
} 
// 给 pos 位置的元素设为 value
public void set(int pos, int value) { 
}
//删除第一次出现的关键字key
public void remove(int toRemove) { 
} 
// 获取顺序表长度
public int size() { 
return 0; 
} 
// 清空顺序表
public void clear() { 
} 
}

我们依次实现。

1.主类中的定义

用于控制之后代码中相应的数据

public class SeqList {
    private int []array ;  //定义一个数组
    private int usedSized = 0;  //定义记录数组元素个数

    //初始先给10个大小的空间
    public static final int MaxSize = 10;
    public SeqList(){
        this.array = new int[MaxSize];
    }
}

在这里可以先实现获取元素长度的方法,便于之后使用。

public int size() {
        return usedSized;
    }

2.打印顺序表

    // 打印顺序表
    public void display() {
        for (int j = 0; j < this.usedSized; j++) {
            System.out.print(this.array[j] + " ");
        }
        System.out.println();
    }

3.新增元素

注:
新增元素不论元素位置插入在哪都要有以下思考。
1.判断是否元素已经放满。
2.若不是最后插入,要判断是否插入位置合法。

这里可以实现一个判断是否数组已满的方法

    public boolean isFull(){
        if(size() >= this.array.length){
            return true;
        }
        else{
            return false;
        }
    }

在数组尾部插入

//注:这里不要忘记要在主类外实现引用。
import java.util.Arrays;


    public void add(int data) {
        //1.首先要判断数组是否已满,若满了就要扩容
        if(isFull()){
        //这里可以利用Arrays包中的拷贝方法将数组扩大2倍
            this.array = Arrays.copyOf(this.array,2*this.array.length);
        }
        //2.直接增加元素
        this.array[this.usedSized] = data;
        //元素长度加 1 。
        usedSized++;
    }

在数组任意位置插入。

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        //1.同理,判断数组元素是否已满
        if(isFull()){
            this.array = Arrays.copyOf(this.array,2*this.array.length);
        }
        //2.要判断要插入的位置是否合法,不合法就要报错
        //这里的报错,可以自己用代码修改。
        if(pos < 0 || pos >size()){
            System.out.println("pos位置不合法");
            throw new PosWrongfulException("pos位置不合法");
        }
        //3.判断插入位置合法后加入元素
        for (int i = size()-1; i <= pos ; i--) {
            this.array[i+1] = this.array[i];
        }
        this.array[pos] = data;
    }

在上述代码中,报错进行了修改,目的是不让程序因为异常出错进行了重写。

//重新实现一个类
public class PosWrongfulException extends RuntimeException{
    public PosWrongfulException(String message) {
        super(message);
    }
}

4.判断是否包含元素

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

5.获取指定位置的元素

    // 获取 pos 位置的元素
    public int get(int pos) {
        //1.首先判断pos位置元素是否合法
        if(pos < 0 || pos > size()){
            System.out.println("pos位置不合法");
            throw new PosWrongfulException("pos位置不合法");
        }
        //2.判断数组是否为空
        if(size() == 0){
            System.out.println("数组为空无法获取");
            throw new EmptyException("数组为空无法获取");
        }
        //获取位置
        return this.array[pos];
    }

6.对指定的位置设定值

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        //与上方获取pos方式同理
        //1.判空
        if(size() == 0){
            System.out.println("数组为空无法获取");
            throw new EmptyException("数组为空无法获取");
        }
        //2.判合法
        if(pos < 0 || pos > size()){
            System.out.println("pos位置不合法");
            throw new PosWrongfulException("pos位置不合法");
        }
        //3.设值
        this.array[pos] = value;
    }

7.实现删除顺序表中指定出现的第一个元素

    //给一个元素查找方法便于运用
    public int toFind(int find){
        for (int i = 0; i < size(); i++) {
            if(array[i] == find){
                return i;
            }
        }
        return -1;
    }
    //删除第一次出现的关键字key
    public void remove(int key) {
        //1.要删除元素,先判断顺序表是否为空
        if(toFind(key) == -1){
            System.out.println("数组为空无法获取");
            throw new EmptyException("数组为空无法获取");
        }
        //2.查找
        for (int i = toFind(key); i < size()-1; i++) {
            array[i] = array[i+1];
        }
        this.usedSized--;
    }

8.清空顺序表

    // 清空顺序表
    public void clear() {
        this.usedSized = 0;
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值