棧和佇列(c語言白話版)

2021-10-08 10:56:53 字數 2976 閱讀 9065

棧的思想

如何理解呢,在這裡,我們其實可以把棧的結構想象成只有底邊的乙個容器,第一次進去的就會被放在最底下,然後依此類推。關鍵的思想就是在棧中,只能同一端進入或是出去。先進後出,這個和我們下乙個要講的佇列剛好是相反的。

棧的順序儲存方式(原始碼剖析)

//這裡和我們上次講的順序表是差不多的

#define maxsize 600

typedef

struct zhanzhan,*zhan1;

棧的各種操作

棧的初始化

zhan1 init

(zhan s)

判斷棧空

bool emptystack

(zhan s)

入棧

bool push

(zhan s,

int x)

出棧

bool pop

(zhan s,

int x)

讀棧頂元素

//其實在剛才的出棧的**中就實現了讀取棧頂元素

intstacktop

(zhan s,

int x)

//其實這邊也可以不用整型,因為這個是位址傳遞,用布林型別也行

棧的鏈式儲存方式

//棧的鏈式儲存方式其實就和我們上次講的單鏈表的結構是一樣的

typedef

struct zhan

*zhan1;

這裡插入刪除就不寫了,參考上篇文章,是一樣的。唯一的區別就是棧的鍊錶結構只能在表頭進行插入和刪除

8. 總結

如果懂了我上篇文章講的順序儲存結構和鏈式儲存結構的話這裡應該特別的好懂。主要就是一些思想上的區別。記住棧的思想是只能在同一端進行插入和刪除,並且先進後出。

思想:佇列的思想其實就是和我們平時排隊是乙個意思。一般都是在隊尾進入隊伍,然後在開頭離開隊伍。總結來講就是先進先出,然後在一頭進行插入,在另一頭進行輸出。和棧一樣,分為順序儲存結構和鏈式儲存結構。

1,順序儲存結構

上**

//佇列的順序結構

#define maxsize 500

typedef

struct queuenodequeuenode;

在講操作之前我們來先講一下迴圈佇列和普通佇列的區別。由上面我對佇列的介紹可以知道。當s.fronts.rear時可以知道這是個空佇列。但是隊之間的空間能被浪費,因為前面的只負責出,所以front只可能增加,而不會減少。所以這樣就造成了隊之間的空間遭到破壞。而當我們引入迴圈佇列這個概念的時候,這一切就變得非常容易了。當我們的隊尾指標指到最後大於空間是又會指向前面已經出隊的空間,於是之前的空間又可以被我們重複利用了。

迴圈佇列判空的條件是q.frontq.rear,而到了判斷是否是滿隊時我們發現條件貌似也是這個等式,那這就不滿足我們條理清晰的目的了。這裡我只講一種解決辦法,也是最常用的解決辦法,就是陣列中空一格元素的空間出來,因為這樣我們就可用(q.rear+1)%maxsize==q.front來表示。

佇列的初始化

//佇列的初始化

bool initqueue

(queuenode q)

佇列的插入

bool inserqueue

(queuenode q,

int x)

q.data[q.rear]=x;

//先把x插入到隊尾指標的位置然後隊尾元素加一

q.rear=

(q.rear+1)

%maxsize;

return true;

}

佇列的出隊

//佇列的出隊

bool outqueue

(queuenode q,

int x)

x=q.data[q.front]

;q.front=

(q.front+1)

%maxsize;

//隊首指標加一

return true;

}

小總結:其實換湯不換藥,我們這裡講佇列其實只是換了一種思想操作什麼的和一般順序結構其實無差別

佇列的鏈式儲存結構

講到這可能會有同學問,我覺得順序儲存已經很好了,為什麼還要鏈式儲存呢,其實通過鏈式儲存和順序儲存的差別我們就可以看出來,鏈式儲存比順序儲存的優勢就是,第一,沒有長度的限制,不需要一開始就要固定長度。二,不存在溢位的情況。三,適合資料量大的工程。

鏈式儲存的結構

//鏈式儲存的結構

typedef

struct linknodelinknode;

typedef

struct queuenodequeuenode;

隊的初始化

//隊的初始化

bool initqueue

(queuenode q)

判斷隊空

//判斷隊空

bool emptyqueue

(queuenode q)

入隊

bool insertqueue

(queuenode q,

int x)

出隊

//出隊

bool outqueue

(queuenode q,

int x)

總結:其實如果我們認真看就會發現,無論是棧還是佇列,更像是對我們才學的順序結構和鏈式結構的具體應用,只要真正的懂順序儲存結構和鏈式儲存結構本章就不會有太大的問題。

棧和佇列c語言版

定義 棧是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為先進後出 last in first out 的線性表,簡稱lifo結構。首先他是乙個線性表,棧元素具有線性關係,即前驅後繼關係。是一種特...

C語言 棧和佇列

什麼是棧,棧有什麼特性?棧,一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行資料插入和刪除的一端稱為棧頂,另一端稱為棧底.插入的操作稱為入棧 進棧 壓棧,刪除操作稱為出棧,插入和刪除的操作都在棧頂.棧中的資料遵循後進先出原則 last in first out 用c語言實現乙個動...

C語言 C 棧和佇列

數制轉換 將乙個非負的十進位制整數n轉換為另乙個等價的基為b的b進製數的問題,很容易通過 除b取餘法 來解決。例 將十進位制數13轉化為二進位制數。解答 按除2取餘法,得到的餘數依次是1 0 1 1,則十進位制數轉化為二進位制數為1101。分析 由於 最先得到 的餘數是轉化結果的 最低位 最後得到的...