1. 程式人生 > >鏈棧:棧的鏈式儲存結構

鏈棧:棧的鏈式儲存結構

轉至:http://www.nowamagic.net/librarys/veda/detail/2290

前面講完了棧的順序儲存結構,我們現在來看看棧的鏈式儲存結構,簡稱為鏈棧。鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指標就是連結串列的頭指標。單鏈表有頭指標,而棧頂指標也是必須的,那幹嗎不讓它倆合二為一呢,所以比較好的辦法是把棧頂放在單鏈表的頭部。另外,都已經有了棧頂在頭部了,單鏈表中比較常用的頭結點也就失去了意義,通常對於鏈找來說,是不需要頭結點的。

所以鏈棧的結構是這樣的:

                                                

對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間,如果真的發生,那此時的計算機作業系統已經面臨宕機崩潰的情況,而不是這個鏈棧是否溢位的問題。但對於空棧來說,連結串列原定義是頭指標指向空,那麼鏈棧的空其實就是 top=NULL 的時候。

與順序棧有點區別,我們先看看以前單鏈表的結構體。

單鏈表的結構體定義:

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型別中定義。
結構體定義完畢之後,後面就可以通過程式設計來熟悉鏈棧的操作了。