数据结构--顺序表(详解)

                                         欢迎大家来到我的博客~
                        欢迎大家对我的博客提出指导,有错误的地方会改进的哦·~

点击这里了解更多内容

目录

一、线性表

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

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

二、顺序表

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

1.定义一个接口,里面放着需要实现的方法:

java 复制代码
public interface Ilist {
    // 新增元素,默认在数组最后新增
    public void add(int data);
    boolean isFull();
    // 在 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() ;
}

2.定义一个mySeqlist类去继承接口,然后对,每个方法进行重写。

java 复制代码
public class mySeqlist implements Ilist{
    public final int DEFALUT_CAPTICY=10;
    public int[] array;
    //定义起始数组大小为10
    public mySeqlist() {
        this.array =new int[DEFALUT_CAPTICY];
    }

    //顺序表的元素个数
    public int usesize;
    // 新增元素,默认在数组最后新增
    @Override
    public void add(int data) {
        
    }

    @Override
    public boolean isFull() {
        return false;
    }

    @Override
    public void add(int pos, int data) {

    }

    @Override
    public boolean contains(int toFind) {
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        return 0;
    }

    @Override
    public int get(int pos) {
        return 0;
    }

    @Override
    public void set(int pos, int value) {

    }

    @Override
    public void remove(int toRemove) {

    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {

    }
}

接下来一个一个来实现这些方法,然后完成一个顺序表的实现。
打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的.

java 复制代码
 @Override
    public void display() {
        for (int i = 0; i < usesize; i++) {
            System.out.print(array[i] + " ");
        }
    }
   

判断数组是否存储满了

java 复制代码
@Override
    public boolean isFull() {
        return this.usesize==array.length;
    }

数组存储满了,然后想插入数据就得进行扩容。

java 复制代码
private int[] grow() {
        return this.array= Arrays.copyOf(this.array,2*this.array.length);
    }

新增元素,默认在数组最后新增

java 复制代码
    @Override
    public void add(int data) {
    //判断数组是否存储满了
        if(isFull()){
            //如果忙了就扩容
            grow();
        }
        array[usesize]=data;
        usesize++;
    }

    private int[] grow() {
        return this.array= Arrays.copyOf(this.array,2*this.array.length);
    }

    @Override
    public boolean isFull() {
        return this.usesize==array.length;
    }

再生成一个test类,每写完一个方法,然后测试是否成功

java 复制代码
public class Test {
    public static void main(String[] args) {
        mySeqlist mylist=new mySeqlist();
        //新增
        mylist.add(1);
        mylist.add(6);
        mylist.add(10);
        mylist.display();
    }
}

运行结果:


在 pos 位置新增元素

可以自定义一个异常,来判断输入的pos位置是否合法

java 复制代码
public class posillegal extends RuntimeException{ 
    public posillegal(){
        super();
    }
    public posillegal(String S){
        super(S);
    }
}

定义一个方法来判断pos是否合法

java 复制代码
   private void Check(int pos) {
        if(pos<0||pos>usesize){
            throw new posillegal("pos位置不合法!!!");
        }
    }

在 pos 位置新增元素

java 复制代码
   public void add(int pos, int data) {
        try{
            Check(pos);
            if(isFull()){
                //如果忙了就扩容
                grow();
            }
            for (int i = usesize; i >pos ; i--) {
                array[i]=array[i-1];
            }
            array[pos]=data;
            usesize++;
        }catch (posillegal e){
            e.printStackTrace();
        }
    }

测试:


点击这里了解什么是异常

判定是否包含某个元素
java 复制代码
@Override
    public boolean contains(int toFind) {
        //先判断数组是否为空
        if(isempty()){
            return false;
        }
       if(Find(toFind)){
           return true;
       }
       return false;
    }

    private boolean isempty() {
        return usesize==0;
    }

    private boolean Find(int tofind) {
        for (int i = 0; i < usesize; i++) {
            if(array[i]==tofind){
                return true;
            }
        }
        return false;
    }

获取值的下标

java 复制代码
   @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usesize; i++) {
            if(array[i]==toFind){
                return i;
            }
        }
        return -1;
    }

获取pos位置的值

java 复制代码
@Override
    public int get(int pos) {
       try{
           Check(pos);
           return array[pos];
       }catch (posillegal e){
           e.printStackTrace();
       }
       return  -1;
    }

把pos位置的元素设置变成value

java 复制代码
  @Override
    public void set(int pos, int value) {
          array[pos]=value;
    }

去除某个值

java 复制代码
  @Override
    public void remove(int toRemove) {
        if(isempty()){
            return;
        }
     int toremove=indexOf(toRemove);
        for (int i = toremove; i <usesize ; i++) {
            array[i]=array[i+1];
        }
        usesize--;
    }

求顺序表的长度

java 复制代码
@Override
    public int size() {
        return usesize;
    }

清空顺序表

java 复制代码
   @Override
    public void clear() {
          usesize=0;
    }

好了,到这里整个顺序表就差不多完成了。下面是完整代码:

Ilist 接口

java 复制代码
public interface Ilist {
    // 新增元素,默认在数组最后新增
    public void add(int data);
    boolean isFull();
    // 在 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() ;
}

mySeqlist类

java 复制代码
import java.util.Arrays;

public class mySeqlist implements Ilist{
    public final int DEFALUT_CAPTICY=10;
    public int[] array;
    //定义起始数组大小为10
    public mySeqlist() {
        this.array =new int[DEFALUT_CAPTICY];
    }

    //顺序表的元素个数
    public int usesize;
    // 新增元素,默认在数组最后新增
    @Override
    public void add(int data) {
    //判断数组是否存储满了
        if(isFull()){
            //如果忙了就扩容
            grow();
        }
        array[usesize]=data;
        usesize++;
    }

    private int[] grow() {
        return this.array= Arrays.copyOf(this.array,2*this.array.length);
    }

    @Override
    public boolean isFull() {
        return this.usesize==array.length;
    }
    // 在 pos 位置新增元素
    @Override
    public void add(int pos, int data) {
        try{
            Check(pos);
            if(isFull()){
                //如果忙了就扩容
                grow();
            }
            for (int i = usesize; i >pos ; i--) {
                array[i]=array[i-1];
            }
            array[pos]=data;
            usesize++;
        }catch (posillegal e){
            e.printStackTrace();
        }
    }

    private void Check(int pos) {
        if(pos<0||pos>usesize){
            throw new posillegal("pos位置不合法!!!");
        }
    }
    // 判定是否包含某个元素
    @Override
    public boolean contains(int toFind) {
        //先判断数组是否为空
        if(isempty()){
            return false;
        }
       if(Find(toFind)){
           return true;
       }
       return false;
    }

    private boolean isempty() {
        return usesize==0;
    }

    private boolean Find(int tofind) {
        for (int i = 0; i < usesize; i++) {
            if(array[i]==tofind){
                return true;
            }
        }
        return false;
    }
   //获取值的下标
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usesize; i++) {
            if(array[i]==toFind){
                return i;
            }
        }
        return -1;
    }
    //获取pos位置的值
    @Override
    public int get(int pos) {
       try{
           Check(pos);
           return array[pos];
       }catch (posillegal e){
           e.printStackTrace();
       }
       return  -1;
    }
   //把pos位置的元素设置变成value
    @Override
    public void set(int pos, int value) {
          array[pos]=value;
    }
   //去除某个值
    @Override
    public void remove(int toRemove) {
        if(isempty()){
            return;
        }
     int toremove=indexOf(toRemove);
        for (int i = toremove; i <usesize ; i++) {
            array[i]=array[i+1];
        }
        usesize--;
    }
    //求顺序表的长度
    @Override
    public int size() {
        return usesize;
    }
     //清空顺序表
    @Override
    public void clear() {
          usesize=0;
    }
   //打印顺序表
    @Override
    public void display() {
        for (int i = 0; i < usesize; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

自定义 pos异常

java 复制代码
public class posillegal extends RuntimeException{
    public posillegal(){
        super();
    }
    public posillegal(String S){
        super(S);
    }
}

测试类(测试仅供参考)

java 复制代码
public class Test {
    public static void main(String[] args) {
        mySeqlist mylist=new mySeqlist();
        //新增
        mylist.add(1);
        mylist.add(6);
        mylist.add(10);
        mylist.add(2,8);
        mylist.display();
        System.out.println();
        //System.out.println(mylist.get(1));
        mylist.set(2,9);
        mylist.remove(6);
        mylist.display();
        System.out.println();
        System.out.println(mylist.size());
        mylist.clear();
        mylist.display();
    }
}

欧耶!!!我学会啦!!!

相关推荐
sjsjs113 小时前
【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数
数据结构·算法·leetcode
星迹日4 小时前
数据结构:ArrayList与顺序表
java·数据结构·经验分享·笔记·顺序表
終不似少年遊*4 小时前
数据结构之线性表
数据结构·笔记·python·算法·线性表
qiu_shi_5 小时前
1.2.1-2部分数据结构的说明02_链表
数据结构
绍兴贝贝7 小时前
代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
数据结构·人工智能·python·算法·力扣
SkyrimCitadelValinor7 小时前
python【数据结构】
开发语言·数据结构·python
就爱学编程7 小时前
重生之我在异世界学编程之数据结构与算法:深入数和二叉树篇
数据结构
_周游7 小时前
【C语言】_const修饰指针变量
c语言·数据结构·算法
爱学习的徐徐13 小时前
【数据结构】链表链表
数据结构·链表
高 朗16 小时前
【算法刷题】链表
数据结构·算法·链表