java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表
前言
其實(shí)線性表在生活中和棧的結(jié)構(gòu)差不多。昨天總結(jié)了一篇單鏈表,也是線性表的一種。
今天用另一種寫法來控制指針的移動(dòng)實(shí)現(xiàn)數(shù)據(jù)的順序存儲(chǔ)結(jié)構(gòu)。
需求分析
首先要明確,這種順序存儲(chǔ)結(jié)構(gòu)的線性表底層用什么。根據(jù)之前查看過的源碼來看,list一般都是以數(shù)組為底層。我們也不例外。
其次,我們還得去定義好線性表的長(zhǎng)度,以及每個(gè)元素的指針。
private Object[] arr; // 底層的結(jié)構(gòu) private int index = -1; // 代表元素的索引位置 private int size; // 當(dāng)前線性表的長(zhǎng)度 private int LinearListLength = 4; // 線性表的默認(rèn)長(zhǎng)度
我們這兒只演示添加、刪除、獲取指定位置、獲取全部以及判斷是否為空這五種形式。
編碼
add方法
add方法為向線性表中添加元素,需要傳入一個(gè)泛型參數(shù)。實(shí)現(xiàn)思路是讓index+1然后把index賦值給數(shù)組得到索引區(qū)域,再讓size+1
總體設(shè)計(jì)比較簡(jiǎn)單,看代碼。
public E add(E item) {
// 先初始化線性表
capacity();
// 初始化完成后先把index指針后移一位,也就是+1
// 后移一位之后將要添加的元素賦值到數(shù)組中
this.arr[++index] = item;
System.out.println(index);
// 添加完成后長(zhǎng)度+1
this.size++;
return item;
}
getIndex方法
getIndex方法主要是用來獲取指定位置的元素,這個(gè)就很簡(jiǎn)單了,因?yàn)榈讓邮菙?shù)組,所以我們可以直接用數(shù)組的索引去獲取。
public E getIndex(int index) {
return (E) this.arr[index];
}
pop方法
pop方法作用是刪除指定位置的元素。需要傳入一個(gè)int類型的索引。由于特殊性,我們必須得借用上面的獲取指定位置的元素的方法來實(shí)現(xiàn)這一步驟。
在元素刪除后,通過遍歷循環(huán)去將index位置向前移動(dòng)一位。具體代碼如下:
/**
* 刪除指定位置的元素
*/
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方法需要傳入兩個(gè)參數(shù),一個(gè)int類型的索引值,一個(gè)泛型數(shù)據(jù)。在指定位置插入該泛型值,然后將后面的值全部后移一位。
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
這個(gè)方法不用我多說了,一個(gè)簡(jiǎn)單的遍歷循環(huán)
public void getAll() {
for (Object o : this.arr) {
System.out.println(o);
}
}
這兒遍歷的Object類型會(huì)自動(dòng)轉(zhuǎn)化成添加元素時(shí)的類型
全部代碼
package com.zxy.xianxingbiao;
/**
* @Author Zxy
* @Date 2021/2/4 16:54
* @Version 1.0
*/
import java.util.Arrays;
/**
* 演示線性表的使用 底層使用數(shù)組
*/
public class MyLinearList<E> {
private Object[] arr; // 底層的結(jié)構(gòu)
private int index = -1; // 代表元素的索引位置
private int size; // 當(dāng)前線性表的長(zhǎng)度
private int LinearListLength = 4; // 線性表的默認(rèn)長(zhǎng)度
/**
* 判斷線性表是否為空
*/
public boolean empty() {
return this.size == 0 ? true : false;
}
/**
* 給線性表中添加元素
*/
public E add(E item) {
// 先初始化線性表
capacity();
// 初始化完成后先把index指針后移一位,也就是+1
// 后移一位之后將要添加的元素賦值到數(shù)組中
this.arr[++index] = item;
System.out.println(index);
// 添加完成后長(zhǎng)度+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);
}
}
/**
* 數(shù)組初始化或者以1.5倍容量對(duì)數(shù)組擴(kuò)容
*/
private void capacity() {
// 數(shù)組初始化
if (this.arr == null) {
this.arr = new Object[this.LinearListLength];
}
// 以1.5倍對(duì)數(shù)組擴(kuò)容
if (this.size - (this.LinearListLength - 1) >= 0) { // 如果當(dāng)前數(shù)組的元素個(gè)數(shù)大于了當(dāng)前數(shù)組的最后一個(gè)索引值
this.LinearListLength = this.LinearListLength + (this.LinearListLength >> 1); // 位運(yùn)算,讓長(zhǎng)度變成原來的1/2
this.arr = Arrays.copyOf(this.arr, this.LinearListLength); // 復(fù)制一個(gè)新的數(shù)組,用新開辟的長(zhǎng)度
}
}
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();
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
logback配置中變量和include的應(yīng)用方式
這篇文章主要介紹了logback配置中變量和include的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
maven deploy時(shí)報(bào)錯(cuò)的解決方法
這篇文章主要介紹了maven deploy時(shí)報(bào)錯(cuò)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot啟動(dòng)時(shí)加載指定方法的方式小結(jié)
本文主要給大家介紹了Spring Boot項(xiàng)目啟動(dòng)時(shí)加載指定方法都有哪些方式的,文中給大家介紹了五種常用的方式,有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08
Java Builder模式構(gòu)建MAP/LIST的實(shí)例講解
下面小編就為大家?guī)硪黄狫ava Builder模式構(gòu)建MAP/LIST的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
SpringBoot2.x 參數(shù)校驗(yàn)問題小結(jié)
這篇文章主要介紹了SpringBoot2.x 參數(shù)校驗(yàn)一些問題總結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
使用spring aop統(tǒng)一處理異常和打印日志方式
這篇文章主要介紹了使用spring aop統(tǒng)一處理異常和打印日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

