? ? ????從來不寫筆記的我為什么突然想寫筆記壹店?最近不知道是怎么回事诺舔?感覺自己的記性非常不好,比如接觸了一個新東西卤唉,就算了解了其實現(xiàn)原理涩惑,能跟著思路自己手動完成,但是不過一個星期又忘了桑驱?難道是自己老了竭恬?從前找東西都是找的度娘,就算是使用過的東西也是同樣的找度娘熬的?記性是真的很差痊硕。所以現(xiàn)在想把最近所學(xué)的東西歸納總結(jié)一下,就算忘記了也能不斷的通過筆記來復(fù)習(xí)悦析,都說好記性不如好鍵盤寿桨,最近在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),想把數(shù)據(jù)結(jié)構(gòu)做一個總結(jié)强戴,這個只是個人的總結(jié)亭螟,大牛路過的路望指點其中的不足,作為一名小白我只想把所學(xué)的東西做一個記錄骑歹。
一预烙、為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?
????????舉個例子來說道媚,在古代為什么我們看的武俠電視劇里面的人在修煉武功的時候都要先練習(xí)基本功扁掸?就像少林寺和尚為什么進門之前要先挑水劈柴念經(jīng),為的就是修煉內(nèi)功最域,只有修煉好了內(nèi)功才能在高階武功上進行深造谴分,一步一步的達到上層。這就是為什么一天屠龍記的周芷若在內(nèi)功不扎實的情況下修煉九陰真經(jīng)達不到上層的原因镀脂。作為一個程序員牺蹄,我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的目的就是為了打好基本功,只有這樣一步一個腳印的走下去才能達到高級工程師的水平薄翅。而且在大型公司面試的時候基本都要求會數(shù)據(jù)結(jié)構(gòu)汇陆,因為我們的程序就是數(shù)據(jù)結(jié)構(gòu)和算法組成的皇忿,所以其研究價值比較高瞬欧。
二颜凯、什么是數(shù)據(jù)結(jié)構(gòu)?
????????數(shù)據(jù)結(jié)構(gòu)是對在計算機內(nèi)存中的數(shù)據(jù)的一種安排暑竟。也可以理解為對計算機運算的數(shù)據(jù)單元的一個抽象斋射。很抽象對不對,反正當(dāng)初我在學(xué)習(xí)的時候是沒聽懂這個是什么意思,但是如果我自己來理解的話绩鸣,我覺得就是數(shù)據(jù)與數(shù)據(jù)之間存在的一種關(guān)系怀大,是我們的數(shù)據(jù)在計算機中的模型。
三呀闻、數(shù)據(jù)結(jié)構(gòu)研究的內(nèi)容
(一)數(shù)據(jù)的邏輯結(jié)構(gòu)
? ??????????1. 集合結(jié)構(gòu)
????????????????????數(shù)據(jù)結(jié)構(gòu)中的元素之間除了"同屬一個集合" 的相互關(guān)系外化借,別無其他關(guān)系。
????????????2. 線性結(jié)構(gòu)
????????????????????數(shù)據(jù)結(jié)構(gòu)中的元素存在一對一的相互關(guān)系;
????????????3. 樹形結(jié)構(gòu)
????????????????????數(shù)據(jù)結(jié)構(gòu)中的元素存在一對多的相互關(guān)系;
????????????4. 圖形結(jié)構(gòu)
????????????????數(shù)據(jù)結(jié)構(gòu)中的元素存在多對多的相互關(guān)系捡多。
????光看這幾個名詞我們是不太明白它是什么東西的蓖康,接下來上圖就好理解了。
? ? 根據(jù)我們的理解和認知我們大概可以從上圖了解到數(shù)據(jù)結(jié)構(gòu)是個什么東西了垒手。
(二)數(shù)據(jù)結(jié)構(gòu)的存儲結(jié)構(gòu)(物理結(jié)構(gòu))
????????????1. 表 ? ?
? ? ? ? ? ? 2.堆棧
? ? ? ? ? ? 3.隊列
? ? ? ? ? ? 4.數(shù)組
? ? ? ? ? ? 5.樹
? ? ? ? ? ? 6.圖
四蒜焊、線性表
對于表我們重點來研究線性表,什么是線性表科贬?
由零個或多個數(shù)據(jù)元素組成的有限序列泳梆。線性表屬于數(shù)據(jù)結(jié)構(gòu)中邏輯結(jié)構(gòu)中的線性結(jié)構(gòu)。
注意:
(1)線性表是一個序列榜掌。
(2)0個元素構(gòu)成的線性表是空表优妙。
(3)線性表中的第一個元素?zé)o前驅(qū),最后一個元素?zé)o后繼憎账,其他元素有且只有一個前驅(qū)和后繼套硼。
(4)線性表是有長度的,其長度就是元素個數(shù)胞皱,且線性表的元素個數(shù)是有限的邪意,也就是說,線性表的長度是有限的反砌。
線性表是線性結(jié)構(gòu)的一種雾鬼,那么線性表當(dāng)然也有物理結(jié)構(gòu),也就是說宴树,線性表有兩種策菜,分別是順序結(jié)構(gòu)的線性表(叫做順序表)和鏈式結(jié)構(gòu)的線性表(叫做鏈表)。
(一)順序存儲方式的線性表——順序表
順序表是指順序存儲結(jié)構(gòu)的線性表森渐,指的是用一段地址連續(xù)的存儲單元依次存儲線性表的數(shù)據(jù)元素做入。
順序表表現(xiàn)在物理內(nèi)存中冒晰,也就是物理上的存儲方式同衣,事實上就是在內(nèi)存中找個初始地址,然后通過占位的形式壶运,把一定的內(nèi)存空間給占了耐齐,然后把相同數(shù)據(jù)類型的數(shù)據(jù)元素依次放在這塊空地中。注意,這塊物理內(nèi)存的地址空間是連續(xù)的埠况。舉個例子來說就是“一個蘿卜一個坑”耸携、“排隊”等表現(xiàn)形式。
順序表的數(shù)據(jù)結(jié)構(gòu)的代碼表現(xiàn)形式為:
class Student{
Student[] data;
int size;
}
順序表的應(yīng)用:
ArrayList辕翰,Vector夺衍,ArrayQueue,ArrayDeque喜命,PriorityQueue沟沙。
并發(fā)包:CopyOnWriteArrayList、ArrayBlockingQueue壁榕、PriorityBlockingQueue等矛紫。
(一)鏈式存儲方式的線性表——鏈表
鏈表的特點是用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素,這組存儲單元可以是連續(xù)的牌里,也可以是不連續(xù)的颊咬。
鏈表的分類:
1.單向鏈表
2.單向循環(huán)鏈表
將單鏈表中的終端結(jié)點的指針由空指針指向頭結(jié)點,這樣一來就使整個單鏈表形成了一個環(huán)牡辽,這種頭尾相連的單鏈表稱為單向循環(huán)鏈表喳篇,簡稱循環(huán)鏈表。
3.雙向鏈表
4.雙向循環(huán)鏈表
雙向循環(huán)列表是單向循環(huán)鏈表的每個結(jié)點中催享,在設(shè)置一個指向其前驅(qū)結(jié)點的指針域杭隙,這樣兩個單向循環(huán)鏈表就構(gòu)成了雙向循環(huán)鏈表。
單向鏈表的數(shù)據(jù)結(jié)構(gòu)的代碼表現(xiàn)形式為:
class Node{
Object data;? ? //元素? 數(shù)據(jù)域
Node next;? ? ? //指向當(dāng)前節(jié)點的下一個元素結(jié)點
}
雙向鏈表的數(shù)據(jù)結(jié)構(gòu)的代碼表現(xiàn)形式為:
class Node{
Object data;? ? //元素? 數(shù)據(jù)域
Node prev;? ? ? //指向當(dāng)前節(jié)點的上一個節(jié)點
Node next;? ? ? //指向當(dāng)前節(jié)點的下一個節(jié)點
}
單鏈表的應(yīng)用:MessageQueue因妙、LinkedBlockingQueue(并發(fā)包)痰憎。
雙鏈表的應(yīng)用:LinkedList、LinkedBlockingDeque(并發(fā)包)攀涵。