数据结构之顺序表Java实现

线性表之顺序表Java实现

重学数据结构,我现在才看到链表,我就决定先写一下顺序表吧,以前就是没注重动手,当时听懂了理论,过后没多久就忘了,所以我有空就试着写一下博客练练手,记录一下学习的体会和思考,方便自己以后看,也请碰巧看到的大哥们,若有问题请指出来,我也是边学边记录,写得不好请多包涵,先在此谢过。
------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------
顺序表:把线性表中的所有元素按照顺序存储的方法进行存储,也就是用一组地址连续的存储单元依次存储线性表的数据元素。所以顺序表的逻辑顺序和物理顺序是一致的,但是物理位置比逻辑位置少1(因为物理顺序是从0开始的,而逻辑顺序是从1开始的,这一个细节是很重要的!!!)
顺序表的特点:1.顺序表的逻辑顺序和物理顺序是一致的,但是物理位置比逻辑位置少1(因为物理顺序是从0开始的,而逻辑顺序是从1开始的,这一个细节是很重要的!!!)
2.顺序表中任意一个数据元素可以随机存取,即顺序表是一种随机存取的数据结构
在这里插入图片描述

我的代码只用了int型,因为方便嘛,哈哈
下面就是顺序表的创建和一些插入,删除,遍历等实现代码。

  1. 创建一个顺序表
    构造了一个大小为MaxSize的空表
class SqList {
    private int lengths;//顺序表长度
    private Object[] listArray;//存放顺序表元素的数组

    //构造一个大小为Maxsize的空顺序表
    public SqList(int MaxSize) {
        lengths = 0;//初始表中元素为0,即表长为0
        listArray = new Object[MaxSize];
    }
}

就是用一个变量存放表的长度,用一个Object类型的数组存在数据元素,至于为啥要用Object类型的数组呢,因为使用了泛型,Object类型的数组可以存放不同类型的数据元素,更方便使用。我这里就只用了int型数据,主要是记录一下顺序表这种数据结构的思想。
2.往顺序表中存入数据

public void inner(int n)throws Exception {
        if (n < 0 || n > listArray.length) {
            throw new  Exception("超出顺序表大小");
        } else {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入存入的元素:");
            for (int i = 0; i < n; i++) {
                System.out.print("第" + (i + 1) + "个:" + " ");
                listArray[i] = sc.nextInt();
                lengths++;//插入元素之后的表长,i从0开始算,所以+1
            }
        }
    }

通过for循环往表中依次存入数据,当然存入数据之前先判断数据量和表的容量之间的大小,若超出则抛出异常。我这里存入元素是从键盘输入的。
3.判断顺序表是否存满

//判满
    public boolean isFull() {
        //如果表长和数组长度一样,则说明顺序表已经装满
        if (lengths == listArray.length) {
            return true;
        } else {
            return false;
        }
    }

在往顺序表中插入数据元素前一定要判满!
4.判断顺序表示是否为空表

//判空
    public boolean isEmpty() {
        //若表长为0,则顺序表为空表
        if (lengths == 0) {
            return true;
        } else {
            return false;
        }
    }

在删除顺序表中数据元素前要判空!
5.清空顺序表

//清空顺序表
    public void clear() {
        //将数组里的元素全部置空
        for (int i = 0; i < lengths; i++) {
            listArray[i] = null;
        }
        //将表长置0
        lengths = 0;
    }

将数组置为空,表长置为0
6.查找位置为i的元素并返回其值

//查找位置为i的元素并返回其值
    public Object getMember(int i) throws Exception {
        //判断输入查找位置是否在正确区间,这里的i是逻辑位置,即i从1开始的
        if (i < 1 || i > lengths) {
            throw new Exception("查找位置不正确");
        }
        //物理位置比逻辑位置少1
        return listArray[i - 1];
    }

7.返回第一个元素值为x的元素位置

//返回第一个元素值为x的元素位置
    public int locate(Object x) throws Exception {
        //这里的i是物理位置,从0开始找
        int i = 0;
        while (i < lengths && listArray[i] != x) {
            i++;
        }
        if (i >= lengths) {
            throw new Exception("没找到该元素");
        }
        //返回该元素在表中的逻辑位置
        return i + 1;
    }

8.在第i个位置插入元素x
在这里插入图片描述
手画图比较方便,虽然有点丑,将就看吧。
后面空表的格子是空闲空间。
在第i个位置插入数据元素,一共要移动n-i+1次数据元素,n就是表当前长度。

//在第i个位置插入元素x
    public void insert(int i, int x) throws Exception {
        //判满
        if (lengths == listArray.length) {
            throw new Exception("顺序表已满");
        }
        //判断插入元素区间是否有效
        if (i < 1 || i > listArray.length) {
            throw new Exception("插入元素位置不合理");
        }
        //将位置为i的元素及其以后的元素往后移动一位
        for (int j = lengths; j > i - 1; j--) {
            listArray[j] = listArray[j - 1];
        }
        //逻辑位置是i,所以物理位置就是i-1
        listArray[i - 1] = x;
        //顺序表长度加1
        lengths++;
    }

9.删除第i个位置的元素
在这里插入图片描述
删除位置为i的元素,一共要移动n-1次

//删除第i个位置的元素
    public void remove(int i) throws Exception {
        //判断是否为空表
        if (lengths == 0) {
            throw new Exception("顺序表为空");
        }
        //判断删除位置的区间
        if (i < 1 || i > lengths) {
            throw new Exception("删除位置不合理");
        }
        for (int j = i - 1; j < lengths - 1; j++) {
            listArray[j] = listArray[j + 1];
        }
        lengths--;
    }

10.遍历顺序表

//遍历顺序表
   //遍历顺序表
    public void display() {
        for (int i = 0; i < lengths; i++) {
            System.out.print(listArray[i] + " ");
        }
        System.out.println();
    }
}

11.获取当前表的长度,也就是当前表中数据元素

//获取表长
    public int getLengths(){
        return lengths;
    }

最后总的代码如下

import java.util.Scanner;

class SqList {
    private int lengths;//顺序表长度
    private Object[] listArray;//存放顺序表元素的数组

    //构造一个大小为Maxsize的空顺序表
    public SqList(int MaxSize) {
        lengths = 0;//初始表中元素为0,即表长为0
        listArray = new Object[MaxSize];
    }

    //往顺序表中存入元素
    public void inner(int n) throws Exception {
        if (n < 0 || n > listArray.length) {
            throw new Exception("超出顺序表大小");
        } else {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入存入的元素:");
            for (int i = 0; i < n; i++) {
                System.out.print("第" + (i + 1) + "个:" + " ");
                listArray[i] = sc.nextInt();
                lengths = i + 1;//插入元素之后的表长,i从0开始算,所以+1
            }
        }
    }

    //判满
    public boolean isFull() {
        //如果表长和数组长度一样,则说明顺序表已经装满
        if (lengths == listArray.length) {
            return true;
        } else {
            return false;
        }
    }

    //获取表长
    public int getLengths() {
        return lengths;
    }

    //判空
    public boolean isEmpty() {
        //若表长为0,则顺序表为空表
        if (lengths == 0) {
            return true;
        } else {
            return false;
        }
    }

    //查找位置为i的元素并返回其值
    public Object getMember(int i) throws Exception {
        //判断输入查找位置是否在正确区间,这里的i是逻辑位置,即i从1开始的
        if (i < 1 || i > lengths) {
            throw new Exception("查找位置不正确");
        }
        //物理位置比逻辑位置少1
        return listArray[i - 1];
    }

    //返回第一个元素值为x的元素位置
    public int locate(Object x) throws Exception {
        //这里的i是物理位置,从0开始找
        int i = 0;
        while (i < lengths && listArray[i] != x) {
            i++;
        }
        if (i >= lengths) {
            throw new Exception("没找到该元素");
        }
        //返回该元素在表中的逻辑位置
        return i + 1;
    }

    //清空顺序表
    public void clear() {
        //将数组里的元素全部置空
        for (int i = 0; i < lengths; i++) {
            listArray[i] = null;
        }
        //将表长置0
        lengths = 0;
    }

    //在第i个位置插入元素x
    public void insert(int i, int x) throws Exception {
        //判满
        if (lengths == listArray.length) {
            throw new Exception("顺序表已满");
        }
        //判断插入元素区间是否有效
        if (i < 1 || i > listArray.length) {
            throw new Exception("插入元素位置不合理");
        }
        //将位置为i的元素及其以后的元素往后移动一位
        for (int j = lengths; j > i - 1; j--) {
            listArray[j] = listArray[j - 1];
        }
        //逻辑位置是i,物理位置就是i-1
        listArray[i - 1] = x;
        //顺序表长度加1
        lengths++;
    }

    //删除第i个位置的元素
    public void remove(int i) throws Exception {
        //判断是否为空表
        if (lengths == 0) {
            throw new Exception("顺序表为空");
        }
        //判断删除位置的区间
        if (i < 1 || i > lengths) {
            throw new Exception("删除位置不合理");
        }
        for (int j = i - 1; j < lengths - 1; j++) {
            listArray[j] = listArray[j + 1];
        }
        lengths--;
    }

    //遍历顺序表
    public void display() {
        for (int i = 0; i < lengths; i++) {
            System.out.print(listArray[i] + " ");
        }
        System.out.println();
    }
}

public class MySqList {
    public static void main(String[] args) throws Exception {
        Scanner sa = new Scanner(System.in);
        System.out.print("请输入顺序表大小:");
        int maxsiez = sa.nextInt();
        SqList list = new SqList(maxsiez);
        System.out.print("请选择存入几个元素:");
        int n = sa.nextInt();
        list.inner(n);
        System.out.print("此时表中元素为:");
        list.display();
        System.out.print("顺序表是否为满:");
        System.out.println(list.isFull());
        System.out.print("请输入要获取元素的位置:");
        int x = sa.nextInt();
        System.out.print("位置为" + x + "的元素值是:");
        System.out.println(list.getMember(x));
        System.out.print("此时表中元素为:");
        list.display();
        System.out.print("请输入删除元素位置:");
        int y = sa.nextInt();
        list.remove(y);
        System.out.print("此时表中元素为:");
        list.display();
        System.out.print("获取的表长为:");
        System.out.println(list.getLengths());
        System.out.print("请输入插入元素位置:");
        int z = sa.nextInt();
        System.out.print("请输入插入元素值:");
        int w = sa.nextInt();
        list.insert(z, w);
        System.out.print("此时表中元素为:");
        list.display();
        System.out.print("请输入要获取元素的值:");
        int h = sa.nextInt();
        System.out.print("元素值为" + h + "的位置是:");
        System.out.println(list.locate(h));
        System.out.print("此时表中元素为:");
        list.display();
        list.clear();
        System.out.print("顺序表是否为空");
        System.out.println(list.isEmpty());
    }
}

最后我测试的运行结果如下图
在这里插入图片描述
over收工!!!!

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值