前面講完了棧的順序儲存結構,我們現在來看看棧的鏈式儲存結構,簡稱為鏈棧。
鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指標就是鍊錶的頭指標。
棧是用棧頂來做插入和刪除操作,那麼對於鏈棧的棧頂放在鍊錶的頭部還是尾部呢?
單鏈表有頭指標,而棧頂指標也是必須的,那幹嗎不讓它倆合二為一呢,所以比較好的辦法是把棧頂放在單鏈表的頭部。另外,都已經有了棧頂在頭部了,單鏈表中比較常用的頭結點也就失去了意義,通常對於鏈找來說,是不需要頭結點的。
所以鏈棧的結構是這樣的:
對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間,如果真的發生,那此時的計算機作業系統已經面臨宕機崩潰的情況,而不是這個鏈棧是否溢位的問題。
但對於空棧來說,鍊錶原定義是頭指標指向空,那麼鏈棧的空其實就是 top=null 的時候。
鏈棧的結構
對於棧來說,結構體定義需要定義兩部分。乙個是 top 指標,乙個是儲存資料。那麼鏈棧又應該如何設計結構體呢?
與順序棧有點區別,我們先看看以前單鏈表的結構體吧。
單鏈表的結構體定義:
typedef struct node
elemtype data;
struct node *next;
}node;
typedef struct node *linklist; /* 定義linklist */
/* 鏈棧結構 */
typedef struct stacknode
selemtype data;
struct stacknode *next;
} stacknode,*linkstackptr;
以上是鏈棧的乙個結點定義,但是我們還需要加入乙個棧頂指標,所以完整的定義為:
typedef int status;
/* selemtype型別根據實際情況而定,這裡假設為int */
typedef int selemtype;
/* 鏈棧結構 */
typedef struct stacknode
selemtype data;
struct stacknode *next;
} stacknode,*linkstackptr;
typedef struct
linkstackptr top;
int count;
} linkstack;
這裡怎麼多宣告了乙個變數 count?用來幹什麼的嗎?
記錄棧中元素個數,也可以將元素個數屬性放在linkstack型別中定義。
結構體定義完畢之後,後面就可以通過程式設計來熟悉鏈棧的操作了。
延伸閱讀
棧的鏈式儲存
線性表的順序儲存來模擬棧時,在尾部新增或者刪除元素,不會涉及到陣列的元素大量移動 用線性表的鏈式儲存來模擬棧的線性儲存,在頭部新增或刪除,不用從頭到尾遍歷 linkstack.h ifndef my linkstack h define my linkstack h typedef void lin...
C 棧 鏈式儲存
ifndef my linkstack h define my linkstack h typedef void linkstack linkstack linkstack create void linkstack destroy linkstack stack void linkstack cl...
棧 鏈式儲存結構
講完了棧的順序儲存結構,現在來看棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部?由於單鏈表有頭指標,而棧頂指標也是必須的,所以比較好的辦法是把棧頂放在單鏈表的頭部。都已經有了棧頂在頭部了,單鏈表中常用的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭...