基本數(shù)據(jù)結(jié)構(gòu)(棧材蛛、隊列圆到、鏈表、樹仰税、堆)

棧##

棧是一種動態(tài)集合构资,它是一種LIFO(last in first out后進(jìn)先出)結(jié)構(gòu)
棧的實現(xiàn)
(1)數(shù)組
(2)鏈表
棧要記錄的數(shù)據(jù)
(1)棧頂位置top
注意這個top有兩種理解方式,一種是表示棧的最后一個數(shù)據(jù)的位置陨簇,另一種是表示棧的最后一個數(shù)據(jù)的下一個位置吐绵,這兩種理解對棧的操作代碼有一定的影響
(2)棧最大大小size
棧的操作
(1)STACK_EMPTY():判斷棧是否為空
(2)PUSH(X):向棧中添加一個值,注意棧是否為滿的
(3)POP():從棧中彈出一個值河绽,注意棧是否為空

棧的簡要實現(xiàn)github棧
棧的應(yīng)用
(1)括號匹配問題

隊列##

與棧不同己单,它是一種FIFO(first in first out先進(jìn)先出)結(jié)構(gòu)
隊列的實現(xiàn)
(1)數(shù)組
(2)鏈表
隊列要記錄的數(shù)據(jù)
(1)隊首位置head:第一個元素位置
(2)隊尾位置tail:下一個元素要插入的位置(最后一個元素的下一個位置)
(3)隊列最大大小size
隊列的操作
(1)ENQUEUE(x):入隊
(2)DEQUEUE():出隊
(3)EMPTY():隊列為空,head=tail
(4)FULL():隊列為滿耙饰,head=(tail+1)%size

隊列

隊列的簡要實現(xiàn)github隊列
隊列的應(yīng)用
(1)

鏈表##

與數(shù)組中元素地址連續(xù)不同纹笼,鏈表中兩個元素地址不一定連續(xù),而是由專門的一個指針指明該元素的后一個(前一個)元素的地址苟跪。
鏈表種類
(1)單向鏈表:只有指向后一個元素的指針
(2)雙向鏈表:有指向后一個和前一個元素的指針
(3)循環(huán)鏈表:鏈表內(nèi)存在一個環(huán)
鏈表節(jié)點(Node)記錄的數(shù)據(jù)
(1)要存儲的數(shù)據(jù)data
(2)下一個節(jié)點地址Node* next
(3)若是雙向鏈表還要存儲前一個節(jié)點地址Node prev
鏈表(LinkedList)記錄的數(shù)據(jù)
(1)鏈表的頭指針Node
head
(2)可能還記錄鏈表的尾指針 Node* tail
鏈表的操作
(1)SEARCH(x):鏈表的搜索
(2)INSERT(i,x):鏈表的插入廷痘,在第i個位置插入x
(3)DELETE(x):鏈表的刪除
哨兵(sentinel)
為了減少邊界條件的判斷(是否為空鏈表等等),引入哨兵件已,使得鏈表永遠(yuǎn)不為“空”笋额。
指針和對象的實現(xiàn)
有些語言比如Java沒有指針(C中就存在指針),這時我們需要考慮指針的替代實現(xiàn)方式篷扩。
(1)用二維數(shù)組表示指針
我們可以設(shè)置一個n*3的數(shù)組記錄n個節(jié)點兄猩,那個3就表示存儲的數(shù)據(jù)、前一個元素的坐標(biāo)(index)和后一個元素的坐標(biāo)。
(2)用一維數(shù)組表示指針

一維數(shù)組代替指針

樹##

樹的種類
(1)二叉樹
二叉樹要存儲4個數(shù)據(jù)枢冤,分別是節(jié)點攜帶的信息和其父節(jié)點鸠姨、左右子節(jié)點的指針。
(2)分支無限制的有根樹:
上面二叉樹每個節(jié)點最多有兩個子節(jié)點淹真,而分支無限制的有根數(shù)則沒有這個限制讶迁,可能有3個、5個甚至更多子節(jié)點趟咆。所以存儲這種數(shù)據(jù)結(jié)構(gòu)的問題在于我們事先并不知道應(yīng)該設(shè)置多少個child指針添瓷,若設(shè)置的少了不能滿足要求,設(shè)置的過多又會浪費空間值纱。所以這里提出一種新的描述這種數(shù)據(jù)結(jié)構(gòu)的方法——左孩子右兄弟表示法鳞贷,這種方法每個節(jié)點設(shè)置3個指針:父指針、從左數(shù)第一個孩子的指針虐唠、其右側(cè)相鄰的兄弟指針搀愧,如下圖所示

左孩子右兄弟表示法

堆##

堆實際上是以數(shù)組形式存儲的二叉樹
堆需要存儲的數(shù)據(jù):
(1)數(shù)組的大小max-size
(2)堆元素個數(shù)size,這里size要小于max-size
堆中元素通過坐標(biāo)來確定父節(jié)點疆偿、左右子節(jié)點咱筛,具體來說
一個節(jié)點i的父節(jié)點:[i/2]
一個節(jié)點i的左子節(jié)點:[i2]
一個節(jié)點i的右子節(jié)點:[i
2+1]
堆的分類
(1)最大堆
滿足所有節(jié)點都比其父節(jié)點值小(小于等于)的堆
A[i/2]>=A[i]
(2)最小堆
滿足所有節(jié)點都比其父節(jié)點值大(大于等于)的堆
A[i/2]<=A[i]
堆的操作
(1)維護堆的性質(zhì)(HEAPIFY)
這里指維護最大堆或最小堆的性質(zhì)杆故。假設(shè)一個數(shù)組中下標(biāo)為i的節(jié)點的子節(jié)點滿足最大(醒嘎帷)堆性質(zhì),但自身不一定滿足這個性質(zhì)处铛,這時就需要HEAPIFY饲趋,具體來說是要比較這個節(jié)點和其兩個子節(jié)點的大小,將其中的大(谐敷 )的和該節(jié)點位置交換奕塑,這樣這個節(jié)點及其兩個子節(jié)點就滿足最大(小)堆的性質(zhì)了家肯,但是可能交換后子節(jié)點不滿足堆的性質(zhì)龄砰,所以這里要遞歸調(diào)用HEAPIFY,直到達(dá)到最下層節(jié)點讨衣,這樣就維護了堆的性質(zhì)换棚。HEAPIFY耗時O(lgn)
(2)建堆(BUILD-HEAPIFY)
從中間那個元素開始到第一個元素,逐一調(diào)用HEAPIFY函數(shù)反镇,即可完成建堆圃泡。
逐一從中間那個元素開始遞減而不是從第一個元素遞增,這時為了保證每次調(diào)用HEAPIFY都能保證該節(jié)點的子節(jié)點都滿足最大(性赶铡)堆的性質(zhì),否則無法調(diào)用HEAPIFY。中間那個元素是第一個可能不滿足最大(辛究鳌)堆性質(zhì)的節(jié)點风秤,所以從這里開始維護(HEAPIFY)。一個建堆的例子如下所示:[5,3,17,10,84,19,6,22,9]

建堆

建堆的期望時間為O(n)

堆的應(yīng)用:
(1)堆排序(詳見排序算法
(2)優(yōu)先隊列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扮叨,一起剝皮案震驚了整個濱河市缤弦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彻磁,老刑警劉巖碍沐,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衷蜓,居然都是意外死亡累提,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門磁浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斋陪,“玉大人,你說我怎么就攤上這事置吓∥扌椋” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵衍锚,是天一觀的道長友题。 經(jīng)常有香客問我,道長戴质,這世上最難降的妖魔是什么度宦? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮置森,結(jié)果婚禮上斗埂,老公的妹妹穿的比我還像新娘。我一直安慰自己凫海,他們只是感情好呛凶,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著行贪,像睡著了一般漾稀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上建瘫,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天崭捍,我揣著相機與錄音,去河邊找鬼啰脚。 笑死殷蛇,一個胖子當(dāng)著我的面吹牛实夹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粒梦,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亮航,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匀们?” 一聲冷哼從身側(cè)響起缴淋,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泄朴,沒想到半個月后重抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡祖灰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年钟沛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夫植。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡讹剔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出详民,到底是詐尸還是另有隱情延欠,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布沈跨,位于F島的核電站由捎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饿凛。R本人自食惡果不足惜狞玛,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涧窒。 院中可真熱鬧心肪,春花似錦、人聲如沸纠吴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戴已。三九已至固该,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糖儡,已是汗流浹背伐坏。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留握联,地道東北人桦沉。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓每瞒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親永部。 傳聞我的和親對象是個殘疾皇子独泞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容