鏈棧

鏈棧

  個人認爲,簡單形容棧就是隻有一個頭能進出。first in last out相信不是很難理解的問題,在這裏主要講一講鏈棧。

  首先鏈棧同樣是棧,當然也是filo的。

  鏈棧是指採用鏈接存儲的結構實現的棧。事實上鍊棧和鏈表的樣子很像。

                                                                             

  其中data爲數據,next爲下一個數據的指針

class LinkStack
{
    datatype data;
    LinkStack *next;
}

  LinkStack就是就是這樣的數據類型。LinkStack t,*S=&t;。然後使用S->data描述該點元素的值,S->next來描述該節點邏輯後繼值的存儲地址。

  由於鏈棧不存在棧滿的情況,所以不需要像正常的順序棧一樣判斷是否棧滿。對鏈棧的操作同樣有以下幾類:置空棧,判空棧,判滿棧,取棧頂元素,入棧,出棧。

鏈棧置空算法

LinkStack * SetStack()
{
    LinkStack *LS;
    LS=NULL;
    return LS;
}

 

鏈棧判斷空算法

複製代碼

int StackEmpty(LinkStack *LS)//空時返回1,不空返回0
{
    if(LS==NULL)
    return 1;
    else
    return 0;
}

複製代碼

 

鏈棧取頂算法

複製代碼

datatype GetTop(LinkStack *LS)
{
    if(LS!=NULL)
        return LS->data;
    else
        cout<<"棧空";
}

複製代碼


鏈棧入棧算法

在棧頂插入值爲x的元素存放在一個新創建的LinkStack的data中。原本的LS與新創建的LinkStack的next相等。然後LS與原來的首元素斷開,與x連接。如圖:

複製代碼

LinkStack *Push(LinkStack *LS,datatype x)
{
    LinkStack *p;
    p=(LinkStack *)malloc(sizeof(LinkStack))
    p->data=x;
    p->next=LS;
    LS=p;
    return LS;
}

複製代碼


鏈棧出棧算法

首先將創建一個新的LinkStack  *pop,不需要分配內存空間。直接將pop指向出棧data,LS指向pop的next空間。然後斷開LS原本指向pop中data。

複製代碼

LinkStack *POP(LinkStack *LS)
{
    LinkStack *poptem;
    poptem=LS;
    LS=poptem->next;
    free(poptem);
    return LS;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章