欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现简单顺序表

程序员文章站 2022-05-26 12:06:37
...

要实现顺序表首先要了解什么是顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

由于顺序表是在计算机内存中保存的,计算机内存又有随机访问数据的能力,所以顺序表对数据的 有着很大的优势,时间复杂度为O(1)。而对数据的 这方面表现却是一般,时间复杂度为O(N)。
那么我们了解了什么是顺序表和顺序表有哪些优点后,我们就来看他有什么具体功能:

  1. 增(指定位置增加新的元素)
  2. 删(指定位置删除对应元素)
  3. 查(查看指定位置的元素或显示当前表中所有元素)
  4. 改(改变指定位置的元素内容或者将表中内容全部清空)

下面我们就用代码来具体实现简单的顺序表:

public class seqList {
	//由于只是表示表中能含多少元素,所以不必要让使用者看到
    private int num = 10; 
  	//存放数据的数组
    private int[] data = new int[num];
    //表示当前表中有效元素个数
    private int size = 0; 
    // 打印顺序表
    public void display() {
        System.out.print("[");
        for (int i = 0; i < size; i++) {
            System.out.print(data[i]);
            if (i < this.size - 1) {
            //最后一个元素之后不需要打印 ","
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if (pos < 0 || pos > size) {
            //判断输入合法性
            System.out.println("您的操作有误!请重新输操作!");
            return;
        } else if (size >= num) {
            //如果表已满需要对表进行扩容
            addList();
            System.out.println("内容已满!已经扩容10个,请重新操作!");
            return;
        } else if (pos == size) {
            //在最后位置新增元素
            this.data[pos] = data;
            size++;
        } else {
            //在中间位置新增元素
            for (int i = size - 1; i < pos; i--) {
                this.data[i + 1] = this.data[i];
            }
            this.data[pos] = data;
            size++;
        }
    }

    //扩容10个元素
    public void addList() {
    	//在原基础上在增加10个
        num = num + 10;
        int[] data = new int[num];
        for (int i = 0 ; i < size; i++) {
            data[i] = this.data[i];
        }
        this.data = data;
    }

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

    // 查找某个元素对应的位置
    public void search(int toFind) {
        int i = 0;
        for (i = 0; i < size; i++) {
            if (data[i] == toFind) {
                System.out.println("位置是:" + i);
            }
        }
        if ( i >= size) {
            //如果i >= size 说明目标元素不存在
            System.out.println(toFind + "不存在");
        }
    }

    // 获取 pos 位置的元素
    public void getPos(int pos) {
        if (pos < 0 || pos > size) {
            //判断位置合法性
            System.out.println("您的操作有误!请重新操作");;
        } else {
            System.out.println(pos + " 位置的元素是" + data[pos]);
        }
    }

    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if (pos < 0 || pos > size) {
            //判断位置合法性
            System.out.println("您的操作有误,请重新操作!");
        } else {
            this.data[pos] = value;
            System.out.println("设置成功!");
        }
    }

    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        if (data[size] == toRemove) {
            //如果刚好是最后一个元素,只需data有效范围 -1
            size--;
            System.out.println("删除成功");
            return;
        }
        for (int i = 0; i < size; i++) {
            if (data[i] == toRemove) {
                //找到第一次出现的位置
                for (int j = i; j < size - 1; j++) {
                    //从后往前移动数据
                    data[j] = data[j + 1];
                }
                System.out.println("删除成功");
                size--;
            }
        }
    }

    // 获取顺序表长度
    public int size() {
        return size;
    }

    // 清空顺序表
    public void clear() {
        size = 0;
        int[] data = new int[size];
        this.data = data;
        System.out.println("清空成功");
    }
}

实现简单顺序表后我们需要使用Test(测试代码)测试一下使用当前顺序表是否有问题:

public class Test {
    public static void main(String[] args) {
        seqList seqlist = new seqList();
            //测试增加
            seqlist.add(0,0);
            seqlist.display();
            seqlist.add(1,1);
            seqlist.display();
            seqlist.add(2,2);
            seqlist.display();
            seqlist.add(3,20);
            seqlist.display();
            seqlist.add(4,4);
            seqlist.display();
            seqlist.add(5,5);
            seqlist.display();
            seqlist.add(6,6);
            seqlist.display();
            seqlist.add(7,7);
            seqlist.display();
            seqlist.add(8,8);
            seqlist.display();
            seqlist.add(9,9);
            seqlist.display();
            seqlist.add(10,10);
            seqlist.add(10,10);
            seqlist.display();
        
            //测试是否有无数字
            System.out.println(seqlist.contains(20));
        
            //测试对应位置元素
            seqlist.search(3);
        
            //测试对应元素的位置
            seqlist.getPos(3);
        
            //测试对应位置重新赋值
            seqlist.setPos(3, -1);
            seqlist.display();
        
            //测试顺序表长度
            System.out.println(seqlist.size());
        
            //测试删除元素
            seqlist.remove(-1);
            seqlist.display();
        
            //测试清空顺序表
            seqlist.clear();
            seqlist.display();
    }
}

测试之后发现并无问题,贴上运行之后的效果图java实现简单顺序表