我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java数据结构基础:线性表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java数据结构基础:线性表

前言

其实线性表在生活中和栈的结构差不多。昨天总结了一篇单链表,也是线性表的一种。

今天用另一种写法来控制指针的移动实现数据的顺序存储结构。

需求分析

首先要明确,这种顺序存储结构的线性表底层用什么。根据之前查看过的源码来看,list一般都是以数组为底层。我们也不例外。

其次,我们还得去定义好线性表的长度,以及每个元素的指针。


private Object[] arr; // 底层的结构
private int index = -1; // 代表元素的索引位置
private int size; // 当前线性表的长度
private int LinearListLength = 4; // 线性表的默认长度

我们这儿只演示添加、删除、获取指定位置、获取全部以及判断是否为空这五种形式。

编码

add方法

add方法为向线性表中添加元素,需要传入一个泛型参数。实现思路是让index+1然后把index赋值给数组得到索引区域,再让size+1

总体设计比较简单,看代码。


public E add(E item) {
        // 先初始化线性表
        capacity();
        // 初始化完成后先把index指针后移一位,也就是+1
        // 后移一位之后将要添加的元素赋值到数组中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后长度+1
        this.size++;
        return item;
    }

getIndex方法

getIndex方法主要是用来获取指定位置的元素,这个就很简单了,因为底层是数组,所以我们可以直接用数组的索引去获取。


public E getIndex(int index) {
        return (E) this.arr[index];
    }

pop方法

pop方法作用是删除指定位置的元素。需要传入一个int类型的索引。由于特殊性,我们必须得借用上面的获取指定位置的元素的方法来实现这一步骤。

在元素删除后,通过遍历循环去将index位置向前移动一位。具体代码如下:



public E pop(int index) {
    E e = getIndex(index);
    if (e != null) {
        for (int i = index; i < size; i++) {
            arr[i] = arr[i + 1];
        }
        this.size--;
        return e;
    } else {
        return null;
    }
}

insert方法

insert方法需要传入两个参数,一个int类型的索引值,一个泛型数据。在指定位置插入该泛型值,然后将后面的值全部后移一位。


public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }

getAll

这个方法不用我多说了,一个简单的遍历循环


public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }

这儿遍历的Object类型会自动转化成添加元素时的类型

全部代码


package com.zxy.xianxingbiao;

import java.util.Arrays;

public class MyLinearList<E> {
    private Object[] arr; // 底层的结构
    private int index = -1; // 代表元素的索引位置
    private int size; // 当前线性表的长度
    private int LinearListLength = 4; // 线性表的默认长度
    
    public boolean empty() {
        return this.size == 0 ? true : false;
    }
    
    public E add(E item) {
        // 先初始化线性表
        capacity();
        // 初始化完成后先把index指针后移一位,也就是+1
        // 后移一位之后将要添加的元素赋值到数组中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后长度+1
        this.size++;
        return item;
    }
    
    public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }
    
    public E getIndex(int index) {
        return (E) this.arr[index];
    }
    
    public E pop(int index) {
        E e = getIndex(index);
        if (e != null) {
            for (int i = index; i < size; i++) {
                arr[i] = arr[i + 1];
            }
            this.size--;
            return e;
        } else {
            return null;
        }
    }
    
    public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }
    
    private void capacity() {
        // 数组初始化
        if (this.arr == null) {
            this.arr = new Object[this.LinearListLength];
        }
        // 以1.5倍对数组扩容
        if (this.size - (this.LinearListLength - 1) >= 0) { // 如果当前数组的元素个数大于了当前数组的最后一个索引值
            this.LinearListLength = this.LinearListLength + (this.LinearListLength >> 1); // 位运算,让长度变成原来的1/2
            this.arr = Arrays.copyOf(this.arr, this.LinearListLength); // 复制一个新的数组,用新开辟的长度
        }
    }
    public static void main(String[] args) {
        MyLinearList<String> list = new MyLinearList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list.getIndex(1));
        list.pop(1);
        System.out.println(list.getIndex(1));
        list.getAll();
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java数据结构基础:线性表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis基础数据结构

Redis数据结构:String、Hash、List、Set、ZSet(每种数据结构均包含两种以上的内部编码)Redis单线程架构:1. 纯内存访问2. 非阻塞I/O (采用多路复用技术epoll)3. 减少了线程切换和竞态产生的消耗字符串:实际值可以使字符串
Redis基础数据结构
2016-07-28

Python实现基本线性数据结构

数组数组的设计数组设计之初是在形式上依赖内存分配而成的,所以必须在使用前预先请求空间。这使得数组有以下特性:1、请求空间以后大小固定,不能再改变(数据溢出问题);2、在内存中有空间连续性的表现,中间不会存在其他程序需要调用的数据,为此数组的
2022-06-04

Java线性数据结构是什么

本篇内容介绍了“Java线性数据结构是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1)数组一眼看上去就知道的,像 String []、
2023-06-15

Java常见基础数据结构有哪些

这篇文章主要介绍Java常见基础数据结构有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!栈:stack,又称堆栈,他是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查
2023-06-20

TypeScript基础数据结构哈希表HashTable教程

这篇文章主要为大家介绍了TypeScript基础数据结构哈希表HashTable教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-05

线性结构 数组与链表

线性结构 数组与链表线性结构线性数据结构有两端,有时被称为左右,某些情况被称为前后。你也可以称为顶部和底部,名字都不重要。将两个线性数据结构区分开的方法是添加和移除项的方式,特别是添加和移除项的位置。例如一些结构允许从一端添加项,另一些允
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录