1. 程式人生 > >《資料結構和演算法》之棧的鏈式儲存結構

《資料結構和演算法》之棧的鏈式儲存結構

        在上篇博文中我已經將棧的順序儲存結構簡單地介紹了一下,也舉了一個進位制轉換的例子,供大家學習參考。這裡將繼續進行棧的有關介紹,本篇博文重點對棧的鏈式儲存結構進行分析。

一,棧的鏈式儲存結構

        棧的鏈式儲存結構簡稱棧鏈。棧因為只是棧頂來做插入和刪除操作,所以比較好的方法就是將棧頂放在單鏈表的頭部,棧頂指標和單鏈表的頭指標合二為一。

                                                                                         

                                                                                                               圖1  棧的鏈式結構示意圖

          在圖1中可以看到,這是一個棧鏈,棧頂就相當於單鏈表的表頭,棧底就相當於單鏈表的表尾。

二,棧鏈的定義結構

typedef struct StackNode
{
    ElemType data;  //存放棧的資料
    struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPrt top;   //指標
    int count;          //棧元素計算器
}

三,棧的具體操作

    1,進棧操作

          對於棧鏈的Push操作,假設元素的值為e的新結點是s, top為棧頂指標,我們得到如下程式碼:

Satus Push(LinkStack *s,ElemType e)
{
    LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
    p->data = e;
    p->next = s->top;
    s->top = p;
    s->count++;
    return OK;
}

     2,出棧操作

        鏈棧的出棧Pop操作,也是假設變數p用來儲存要刪除的棧頂結點,將棧頂指標下移一位,最後釋放p即可。

Satus Push(LinkStack *s,ElemType e)
{
    LinkStackPtr p;
    if(StackEmpty(*s))
        return ERROR;
    *e = s->top->data;
    p = s->top;
    s->top = s->top->next;
    free(p);
    s->count--;
    return OK;
}