国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? 作者:小胡_不糊涂
?? 作者主頁:小胡_不糊涂的個人主頁
?? 收錄專欄:淺談數(shù)據(jù)結(jié)構(gòu)
?? 持續(xù)更文,關(guān)注博主少走彎路,謝謝大家支持 ??


【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表,淺談數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

1. 線性表

線性表(linear list) 是n個具有相同特性的數(shù)據(jù)元素的有限序列。 它是一種在實際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊列…

線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲時,通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲。

【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表,淺談數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

2. 順序表

順序表 是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。在數(shù)組上完成數(shù)據(jù)的增刪查改。

2.1 接口的實現(xiàn)

實現(xiàn)順序表的插入、刪除、修改、查找工作:

import java.util.Arrays;
public class MyArrayList {
    public int[] elem ;//定義一個數(shù)組
    public int usedSize;//0,用來記錄元素個數(shù)
    //順序表的 默認(rèn)大小
    public static final int DEFAULT_SIZE = 10;
    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyArrayList(int capacity) {
        this.elem = new int[capacity];
    }

    //順序表尾部插入元素
    public void add(int data) {
        checkCapacity();
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

    //判斷順序表是否為空
    public boolean isFull() {
        /*if(usedSize == elem.length) {
            return true;
        }
        return false;*/
        return usedSize == elem.length;
    }

    //指定pos位置添加元素data
    public void add(int pos, int data) {
        try {
            checkPosOnAdd(pos);
        }catch (PosIllegality e) {
            e.printStackTrace();
        }
        checkCapacity();
        //1、從最后一個有效的數(shù)據(jù)開始往后移動 //2、當(dāng)i < pos 就結(jié)束
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }
        //3、存放元素到pos 位置
        elem[pos] = data;
        //4、usedSize++;
        usedSize++;
    }

    //檢查插入位置pos的合法性
    private void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos > usedSize) {
            System.out.println("不符合法!");
            throw new PosIllegality("插入元素下標(biāo)異常: "+pos);
        }
    }

    private void checkCapacity() {
        if(isFull()) {
            //擴容
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }

    //判定是否包含某一元素
    public boolean contains(int toFind) {
        if(isEmpty()) {
            return false;
        }
        for (int i = 0; i < usedSize; i++) {
            //如果是查找引用數(shù)據(jù)類型 一定記住 重寫方法
            if(elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //判斷線性表是否為空
    public boolean isEmpty() {
        return usedSize == 0;
    }

    //查找某個元素對應(yīng)位置
    public int indexOf(int toFind) {
        if(isEmpty()) {
            return -1;
        }
        for (int i = 0; i < usedSize; i++) {
            //如果是查找引用數(shù)據(jù)類型 一定記住 重寫方法
            if(elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //獲取pos位置元素
    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()) {
            throw new MyArrayListEmpty("獲取指定下標(biāo)元素時" +
                    "順序表為空!");
        }
        return elem[pos];
    }

    private void checkPosOnGetAndSet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usedSize) {
            System.out.println("不符合法!");
            throw new PosIllegality("獲取指定下標(biāo)的元素異常: "+pos);
        }
    }

    //給pos位置設(shè)為元素value
    public void set(int pos, int value) {
        checkPosOnGetAndSet(pos);
        elem[pos] = value;
    }

    //刪除第一次出現(xiàn)的這個數(shù)字
    public void remove(int toRemove) {
        int index = indexOf(toRemove);//獲取元素下標(biāo)
        if(index == -1) {
            System.out.println("沒有這個數(shù)字!");
            return;
        }
        for(int i = index; i < usedSize-1;i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;
    }

    //獲取順序表長度
    public int size() {
        return this.usedSize;
    }

    //清空順序表
    public void clear() {
        this.usedSize = 0;
    }

    //打印順序表中元素
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }

}

測試類:

public class TestMAL{
    public static void main(String[] arg) {
        MyArrayList arr = new MyArrayList();
        arr.add(1);
        arr.add(2);
        arr.add(3);
        arr.add(4);
        arr.add(5);
       arr.display();
       System.out.println("-------");
       arr.add(1);
        arr.display();
        System.out.println("-------");
        arr.add(6,2);
        arr.display();
        System.out.println("-------");
        System.out.println(arr.indexOf(3));
        arr.display();
        System.out.println("-------");
        arr.get(9);
    }
}

3. ArrayList簡介

在集合框架中,ArrayList是一個普通的類,實現(xiàn)了List接口,具體框架圖如下:

【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表,淺談數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)

【說明】

  1. ArrayList是以泛型方式實現(xiàn)的,使用時必須要先實例化
  2. ArrayList實現(xiàn)了RandomAccess接口,表明ArrayList支持隨機訪問
  3. ArrayList實現(xiàn)了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList實現(xiàn)了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇Vector或者CopyOnWriteArrayList
  6. ArrayList底層是一段連續(xù)的空間,并且可以動態(tài)擴容,是一個動態(tài)類型的順序表

4. ArrayList使用

4.1 ArrayList構(gòu)造

方法 解釋
ArrayList() 無參構(gòu)造
ArrayList(Collection<? extends E> c) 利用其他 Collection 構(gòu)建 ArrayList
ArrayList(int initialCapacity) 指定順序表初始容量

ArrayList的創(chuàng)建:

public static void main(String[] arg){
    // ArrayList創(chuàng)建,推薦寫法
    // 構(gòu)造一個空的列表
        List<Integer> list1 = new ArrayList<>();
    // 構(gòu)造一個具有10個容量的列表
        List<Integer> list2 = new ArrayList<>(10);
        list2.add(1);
        list2.add(2);
        list2.add(3);
    // list2.add("hello"); // 編譯失敗,List<Integer>已經(jīng)限定了,list2中只能存儲整形元素
    // list3構(gòu)造好之后,與list中的元素一致
        ArrayList<Integer> list3 = new ArrayList<>(list2);
    // 避免省略類型,否則:任意類型的元素都可以存放,使用時將是一場災(zāi)難
        List list4 = new ArrayList();
        list4.add("111");
        list4.add(100);
        System.out.println(list4);//[111,100]
    }

4.2 ArrayList常見操作

方法 解釋
boolean add(E e) 尾插 e
void add(int index, E element) 將 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
E remove(int index) 刪除 index 位置元素
boolean remove(Object o) 刪除遇到的第一個 o
E get(int index) 獲取下標(biāo) index 位置元素
E set(int index, E element) 將下標(biāo) index 位置元素設(shè)置為 element
void clear() 清空
boolean contains(Object o) 判斷 o 是否在線性表中
int indexOf(Object o) 返回第一個 o 所在下標(biāo)
int lastIndexOf(Object o) 返回最后一個 o 的下標(biāo)
List subList(int fromIndex, int toIndex) 截取部分 list

ArrayList操作方法的使用:

 public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("JavaWeb");
        list.add("JavaEE");
        list.add("JVM");
        list.add("測試課程");
        System.out.println(list);
// 獲取list中有效元素個數(shù)
        System.out.println(list.size());
// 獲取和設(shè)置index位置上的元素,注意index必須介于[0, size)間
        System.out.println(list.get(1));
        list.set(1, "JavaWEB");
        System.out.println(list.get(1));
// 在list的index位置插入指定元素,index及后續(xù)的元素統(tǒng)一往后搬移一個位置
        list.add(1, "Java數(shù)據(jù)結(jié)構(gòu)");
        System.out.println(list);
// 刪除指定元素,找到了就刪除,該元素之后的元素統(tǒng)一往前搬移一個位置
        list.remove("JVM");
        System.out.println(list);
// 刪除list中index位置上的元素,注意index不要超過list中有效元素個數(shù),否則會拋出下標(biāo)越界異常
        list.remove(list.size()-1);
        System.out.println(list);
        // 檢測list中是否包含指定元素,包含返回true,否則返回false
        if(list.contains("測試課程")){
            list.add("測試課程");
        }
// 查找指定元素第一次出現(xiàn)的位置:indexOf從前往后找,lastIndexOf從后往前找
        list.add("JavaSE");
        System.out.println(list.indexOf("JavaSE"));
        System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之間的元素構(gòu)成一個新的SubList返回,但是和ArrayList共用一個elementData數(shù)組
        List<String> ret = list.subList(0, 4);
        System.out.println(ret);
        list.clear();
        System.out.println(list.size());
    }

4.3 ArrayList的遍歷

ArrayList 可以使用三方方式遍歷:for循環(huán)+下標(biāo)、foreach、使用迭代器文章來源地址http://www.zghlxwxcb.cn/news/detail-725566.html

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
    // 使用下標(biāo)+for遍歷
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    // 借助foreach遍歷
        for (Integer integer : list) {
            System.out.print(integer + " ");
        }
        System.out.println();
     //使用迭代器
        Iterator<Integer> it = list.listIterator();
        while(it.hasNext()){
            System.out.print(it.next() + " ");
        }
        System.out.println();
    }

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】線性表與順序表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu) | 入門】線性表與鏈表 (問題引入&實現(xiàn)&算法優(yōu)化)

    【數(shù)據(jù)結(jié)構(gòu) | 入門】線性表與鏈表 (問題引入&實現(xiàn)&算法優(yōu)化)

    ???♂? 個人主頁: @計算機魔術(shù)師 ????? 作者簡介:CSDN內(nèi)容合伙人,全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者。 本文是浙大數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記專欄 這里我們引入一個問題,最常見的多項式,我們?nèi)绾问褂镁幊虒⒍囗検奖硎境鰜砟兀?我們可以使用數(shù)組來表示,但是會隨著一個問題,如下圖底

    2024年01月21日
    瀏覽(129)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】之8道順序表與鏈表典型編程題心決!

    【數(shù)據(jù)結(jié)構(gòu)與算法】之8道順序表與鏈表典型編程題心決!

    ????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?個人主頁:秋風(fēng)起,再歸來~ ? ?????????????????????????????????????????? ? ? ? ? ? ? ?? ???? ? ? ? ? ? ? ???? ? ? ? ? ? 數(shù)據(jù)結(jié)構(gòu)與算

    2024年04月14日
    瀏覽(93)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】順序表與鏈表(單鏈表和雙鏈表)超詳解圖示與源碼。

    【數(shù)據(jù)結(jié)構(gòu)與算法】順序表與鏈表(單鏈表和雙鏈表)超詳解圖示與源碼。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 大家好,今天我們來學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)中的順序表與鏈表!源碼在最后附上 首先我們先來認(rèn)識一下 順序表 : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? **如上圖所示:很多人會以為數(shù)組就是順序表,順序表就是數(shù)組,這

    2024年02月21日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu):線性表順序存儲結(jié)構(gòu)———順序表

    目錄 順序表的定義 初始化線性表 銷毀線性表 求線性表的長度 判斷是否為空表 插入數(shù)據(jù)元素 邏輯序號與物理序號的區(qū)別 刪除數(shù)據(jù)元素 輸出線性表 ?按序號求線性表中的元素 按元素值查找 整體上創(chuàng)建順序表 順序表實驗 線性表的順序存儲是把線性表中的所有元素按照其邏輯

    2024年02月03日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性結(jié)構(gòu) 之 順序表

    【數(shù)據(jù)結(jié)構(gòu)】線性結(jié)構(gòu) 之 順序表

    ??博客主頁:大寄一場. ??系列專欄:數(shù)據(jù)結(jié)構(gòu)與算法 ??博客制作不易歡迎各位??點贊+?收藏+?關(guān)注 目錄 前言 順序表概念及結(jié)構(gòu) 靜態(tài)代碼實現(xiàn): 動態(tài)代碼實現(xiàn): SeqList.h文件 SeqList.c文件 test.c文件 本章節(jié)博主將會帶領(lǐng)大家了解數(shù)據(jù)結(jié)構(gòu)的 線性結(jié)構(gòu)的順序表 。 提到線性

    2024年02月06日
    瀏覽(28)
  • 【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——線性表的順序表示(順序表)

    【玩轉(zhuǎn)408數(shù)據(jù)結(jié)構(gòu)】線性表——線性表的順序表示(順序表)

    ? ? ? ? 通過前文,我們了解到線性表是具有相同數(shù)據(jù)類型的有限個數(shù)據(jù)元素序列;并且,線性表只是一種邏輯結(jié)構(gòu),其不同存儲形式所展現(xiàn)出的也略有不同,那么今天我們來了解一下線性表的順序存儲——順序表。 ? ? ? ? 順序表指的是將 邏輯上相鄰的元素 存儲在 物理位

    2024年02月19日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)-線性表-順序表

    線性表的定義:由n(n=0)個數(shù)據(jù)特性相同的元素構(gòu)成的有限序列,稱為線性表。當(dāng)n=0時稱之為空表。 因為構(gòu)件線性表時元素數(shù)組已經(jīng)使用靜態(tài)分配,所以在此只需要對線性表的長度執(zhí)行初始化即可。 獲取數(shù)據(jù)需要參數(shù): sqList:需要給定一個線性表從而獲取數(shù)據(jù),因為只是拿值

    2024年02月08日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu) · 線性表 | 順序表

    數(shù)據(jù)結(jié)構(gòu) · 線性表 | 順序表

    啊我摔倒了..有沒有人扶我起來學(xué)習(xí).... ?? 個人主頁: 《 C G o d 的 個 人 主 頁 》 color{Darkorange}{《CGod的個人主頁》} 《 C G o d 的 個 人 主 頁 》 交個朋友叭~ ?? 個人社區(qū): 《 編 程 成 神 技 術(shù) 交 流 社 區(qū) 》 color{Darkorange}{《編程成神技術(shù)交流社區(qū)》} 《 編 程 成 神 技 術(shù)

    2024年02月02日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)---順序表示的線性表

    ? ? ? ? ?數(shù)據(jù)結(jié)構(gòu)(data structure)是帶有結(jié)構(gòu)特性的數(shù)據(jù)元素的集合,它研究的是數(shù)據(jù)的邏輯結(jié)構(gòu)和數(shù)據(jù)的物理結(jié)構(gòu)以及它們之間的相互關(guān)系,并對這種結(jié)構(gòu)定義相適應(yīng)的運算,設(shè)計出相應(yīng)的算法,并確保經(jīng)過這些運算以后所得到的新結(jié)構(gòu)仍保持原來的結(jié)構(gòu)類型。簡言之,數(shù)據(jù)

    2024年02月16日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)——線性表①(順序表)

    數(shù)據(jù)結(jié)構(gòu)——線性表①(順序表)

    線性表是一種數(shù)據(jù)結(jié)構(gòu),它是由n個具有 相同數(shù)據(jù)類型 的數(shù)據(jù)元素a1,a2,…,an組成的 有限序列 。 其中,除第一個元素a1外,每一個元素有且只有一個直接前驅(qū)元素,除了最后一個元素an外,每一個元素有且只有一個直接后繼元素。 線性表可以用 順序存儲結(jié)構(gòu) 或 鏈?zhǔn)酱鎯Y(jié)構(gòu)

    2024年02月06日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包