1. 程式人生 > >堆,棧,佇列,連結串列,陣列

堆,棧,佇列,連結串列,陣列

堆和棧從作業系統和資料結構中加以區別:

從OS:堆需要程式猿分配記憶體空間,比如使用malloc函式來進行動態分配,其記憶體空間可以使不連續的,從連結串列中查詢,大小可自由分配,比如在C語言中定義的指標型別的變數,便是需要程式猿進行自行分配記憶體大小,顯然速率偏慢;而棧則是編譯時計算機進行分配,是一段連續的記憶體空間,大小隻有2M左右,速率相對較快,在C語言中 函式的引數從右往左入棧,然後是區域性變數,注意靜態變數不入棧。

從資料結構:堆是一個數組物件,比如堆排序,二叉樹之類的,還有運用於優先順序佇列,比如基於最大堆和最小堆;而棧則是基於一個LIFO規則的資料結構,只有一個口,叫做棧頂,其進行的操作(PUSH and POP)也都是在棧頂進行。

佇列:佇列有兩個口,作用於佇列上的INSERT操作,稱為入隊(ENQUEUE),其稱作為隊尾,作用於佇列上的DELETE操作,稱為出隊(DEQUEUE),其稱為對頭,佇列是遵循FIFO規則,最新插入的元素將會是最新被刪除的元素。迴圈佇列值得是佇列中的元素形成環形,隊尾的最後一個元素和對頭的元素相接,此時若試圖插入新元素,便會出現佇列上溢,既然有佇列上溢,自然而然就有佇列下溢,所謂的佇列下溢,便是當佇列為空時 ,執行DELETE操作。

連結串列和陣列的區別:

連結串列:連結串列中的各物件是按線性排序的,順序由各物件中的指標決定,其的記憶體空間可以不連續,是由一個個節點組成的,node=data+node next ,也就是每個節點都會有資料和節點指標,有一個頭節點指向後面的節點,最後一個節點指向NULL,連結串列的長度是可伸縮的,對資料操作方便,但訪問困難。此外,連結串列還增加了結點指標域,開銷相對較大。有單向連結串列和雙向連結串列

陣列:陣列也是線性排序,但順序是由下標決定的,其的記憶體空間是連續的,在定義時必須給出陣列大小,分配記憶體空間,陣列對資料的訪問簡單,但對資料的操作困難。

2014.12.4更新:(1)陣列棧的建立,push,pop,peep,swap;

(2)連結串列棧的建立,push,pop,peep,swap;

(3)棧計算字尾表示式;

(4)仙人掌棧(多個分棧);

(5)MTFL(most to front list)模型用於搜尋;

(6)棧的回溯演算法,不斷地壓棧和彈棧