資料結構 棧

2021-08-10 05:19:55 字數 1982 閱讀 1495

棧的插入叫做進棧,棧的刪除叫做出棧。棧的進出要遵循「後進先出」的規則。

例如:這裡有三個數字 1, 2, 3。依次進棧,會有哪些出棧結果呢?

第一種:1、2、3依次進棧,3、2、1再依次出棧,這裡的結果就是321;

第二種:1進1出,2進2出,3進3出,這裡的結果就是123;

第三種:1進,2進,2出,1出,3進,3出,這裡的結果就是213;

第四種:1進1出,2進3進,3出2出,這裡的結果就是132;

第五種:1進,2進,2出,3進,3出,1出,這裡的結果是231。

總共就只有5種情況。

棧的順序儲存結構:

前面提到棧是線性表的一種特殊的情況,那麼棧的順序儲存結構就是線性表的順序儲存方式,我們簡稱順序棧。線性表是用陣列進行實現的,那麼用陣列的哪一邊作為棧底好呢。

是的,就是用下標為0的一端作為棧底比較好,因為首元素都存在棧底,變化最小。

棧的鏈式儲存結構——鏈棧

棧也是線性結構的一種特例。與佇列不同,他只有乙個口,只能從這裡讀或者寫資料,這個口稱為棧頂(top)。棧是一種先進後出的資料結構。先進來的元素會放入棧底,而後進來的元素被放在它的上面,最後進來的元素的上面的位置,稱為棧頂。

棧所提供的操作比一般的線性表要少很多,只提供:初始化、銷毀、判斷是否為空、求棧的長度、清空棧、將資料壓入棧、將資料彈出棧、獲得棧頂元素這幾種操作。其中將資料壓入棧、將資料彈出棧、獲得棧頂元素是最重要的。有人可能覺得,將棧頂元素彈出與獲得棧頂元素是不是有點重複,其實它們主要的目的在於,很多時候你只想知道當前棧頂的元素是誰,而並不想將它彈出。這樣做可以簡單一點。

了解了棧的基本結構和操作以後,自然而然的想到用陣列來實現棧:因為前面的元素並不發生變化,只能在最後麵入棧或者出棧。

因為棧的本質是乙個線性表,線性表有兩種儲存形式,那麼棧也有分為棧的順序儲存結構和棧的鏈式儲存結構。

最開始棧中不含有任何資料,叫做空棧,此時棧頂就是棧底。然後資料從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。資料出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。

棧頂——位址較高;

棧底——位址較低。 

定義乙個順序儲存的棧,包含三個元素:base、top、stacksize。

棧的應用——遞迴

今天說的是棧與遞迴的關係,函式的遞迴呼叫和普通函式呼叫是一樣的。當程式執行到某個函式時,將這個函式進行入棧操作,在入棧之前,通常需要完成三件事。

1、將所有的實參、返回位址等資訊傳遞給被調函式儲存。

2、為被調函式的區域性變數分配儲存區。

3、將控制轉移到北調函式入口。

當乙個函式完成之後會進行出棧操作,出棧之前同樣要完成三件事。

1、儲存被調函式的計算結果。

2、釋放被調函式的資料區。

3、依照被調函式儲存的返回位址將控制轉移到呼叫函式。

上述操作必須通過棧來實現,即將整個程式的執行空間安排在乙個棧中。每當執行乙個函式時,就在棧頂分配空間,函式退出後,釋放這塊空間。所以當前執行的函式一定在棧頂。

遞迴程式:

#include

voidrecurrence(int num)

int main(void)

棧的應用——四則運算表示式求值

中綴表示式:就是目前我們用到的計算表示式 如:「9+(3-1)*3+5/2」

字尾表示式:就是把運算子放置到數字的後面 如:"9 3 1 - 3 * + 5 2 / +"

中綴表示式 轉化為字尾表示式規則:

從走到有遍歷中綴表示式的數字和字元

若是數字輸出,即成為字尾表示式的一部分

若是符號則判斷其與棧頂符號的優先順序

是右括號或者優先順序低於棧頂符號(乘除優先於加減)則棧頂元素一次出棧並輸出並將當前符號進棧一直到最終輸出字尾表示式字尾表示式如何用計算機得到結果:

從左到右遍歷表示式的每個數字和符號,

遇到數字就進棧,

遇到符號就將處於棧頂的兩個數字出棧,

進行運算,

運算結果進棧,

一直到最終結果

資料結構 棧 棧

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

資料結構 棧

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

資料結構 棧

1.棧stack 是限定僅在表尾進行刪除和插入操作的線性表。允許插入刪除的一端叫做棧頂top,另外一端叫做棧底bottom。棧又稱為後進先出 lifo 的線性表。即表尾是指棧頂。2.順序棧 定義 top指向可存入元素的位置。typedef struct stacktypestacktype 插入 進...