資料結構入門 棧(下)

2021-08-09 06:46:42 字數 1650 閱讀 7339

上個文章介紹了棧的順序儲存結構,以及兩棧共享的處理方式,接下來我們開始介紹線性結構的另乙個儲存方式,鏈式儲存。如果你鍊錶運用的不夠熟練,那麼接下來的內容會帶你回顧鍊錶的基本操作,以及棧的鏈式儲存操作方法

鍊錶是由一系列結點組成,對於每個結點結構,有資料域和指標域兩個區域,資料域存放結點需要儲存的具體資料,指標域存放指向下乙個結點的指標。每個結點通過指標鏈結。就像乙個導航,你在第乙個結點,你知道第二個結點的位址,然後你到了第二個結點,你獲得了第三個結點的位址……….

一般我們使用指向第乙個結點的頭指標作為整個煉表頭,通過頭指標進行對鍊錶的一系列操作

/*鏈棧的結點結構定義*/

struct node ;

對於棧這一資料結構,它是乙個單向的線性結構,因此我們使用最簡單的單鏈表即可實現,但是這時出現了乙個問題,應該將哪端設為棧定,哪端設為棧底呢?可能你會習慣性的想將煉表頭做棧底,入棧則新增乙個鍊錶結點,並將棧頂指標後移。就像下圖所示

這時出現了乙個問題,我們在刪除結點時需要將rear指標前移,但是單向鍊錶只有後繼指標,rear是無法向前訪問的。或許你可以選擇使用雙向鍊錶,但僅僅為了移動rear指標就額外新增記憶體開銷並且增加了**複雜程度,意義不大。

所以我們應該換種策略,令煉表頭作為棧頂,鍊錶尾作為棧底。在棧底元素入棧時,以及棧底元素出棧時需要移動一次bottom指標。

這樣設計更加直觀便於理解,在空棧->非空棧,非空棧->空棧的操作時移動指標,其他情況只是對單鏈表的基本插入刪除操作,因為鍊錶的動態增刪性,棧頂與棧底指標是不動的,這十分便於處理

下面是出入棧方法的具體實現

void push(t e)

/*普通的鍊錶插入*/

else

length++;

}

void pop(t &e)

else

length--;

}

我們現在紹完了方法,那麼棧具體有什麼用呢?在學習程式設計的過程中,想必你一定寫過遞迴函式吧,斐波那契數,漢諾塔等等。。。遞迴函式,就是函式自身呼叫自身的函式,遞迴函式必須有乙個條件來時自身能夠跳出函式防止無窮遞迴。

那麼我們思考遞迴函式的遞迴過程,可以分為兩個部分,第乙個部分是逐層向下遞迴呼叫的過程,第二個是遞迴到達終點,逐層向上返回的過程。很顯然,這兩個過程是逆序的。在逐層遞迴是依次向下儲存每層的資料,遞迴終點到達又逐層向上恢復。很顯然這很符合棧這一資料結構的特性。 對於每一層遞迴,函式內的變數,引數,返回位址等資訊入棧,返回過程再從棧頂出棧恢復。在程式語言中實現遞迴,就是棧這一資料結構十分具有意義的乙個應用

資料結構 棧 棧

可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...

資料結構入門(一)棧的實現

從這一篇文章開始,筆者將會正式進入資料結構的領域,後面也將會持續更新。本文將會講述一種特殊的線性表結構 棧 stack 棧,是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義,稱為棧頂 top 相應地,表頭端稱為棧底 bottom 不含任何元素的空表稱為空棧。假設棧 s a...

資料結構 棧

例子 棧是一種被限制在只能在表的一端進行插入和刪除運算的線性表。區域性變數是用棧來儲存的 可以進行插入和刪除的一端稱為 棧頂 top 另一端稱為 棧底 bottom 當表中沒有元素時 表長為0的棧 稱為 空棧。棧的修改是按 後進先出的原則進行,因此棧被稱為後進先出 last in first out...