1. 程式人生 > >資料結構知識整理 - 鏈棧

資料結構知識整理 - 鏈棧

主要內容

初始化

入棧

出棧

取棧頂元素


 

棧的定義

佇列是兩種重要的線性結構,與一般線性表不同,它們是操作受限的特殊線性表,主要用於輔助其他資料結構的操作和處理,基本不用於儲存資料元素資訊。

棧(stack)是限定僅在表尾進行插入或刪除操作的線性表,即後進先出(Last In First Out,LIFO)。因此,對棧來說,表尾端有其特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含元素的空表稱為空棧

日常生活中有許多棧的例子。例如,盤子洗好從下往上疊,用的時候從上往下拿;貨物進倉從裡往外堆放,取貨的時候從外往裡取出等等。

在程式設計時,如果需要按照儲存資料時相反的順序來使用資料,則可以用棧來實現。例如,括號(字元)的巢狀,從裡往外巢狀,從外往裡求解;算術運算子的優先順序,按一定條件入棧和出棧運算等等。

 

 

鏈棧的儲存結構

鏈棧是指採用鏈式儲存結構實現的棧,通常採用單鏈表

初始狀態時,棧底結點為空,即 LinkStack S == NULL; ,這同時也是判斷空棧的條件;

當插入新結點時,S指向新結點,新結點指向棧底結點,棧底結點依然為空。

typedef struct StackNode
{
    Elemtype data;

    struct StackNode *next;

} StackNode, *LinkStack;    

 

 

鏈棧的各項操作

棧的主要操作是在棧頂插入和刪除元素,所以以連結串列的頭部作為棧頂(指標)最為合適

 

初始化

構造空棧。

void InitStack(LinkStack &S)
{
    S = NULL;
}

 

入棧

鏈棧在入棧前不需要判斷是否棧滿,只需要為入棧元素動態分配一個結點空間。

void Push(LinkStack &S, Elemtype e)
{
    StackNode *p = new StackNode;
    p->data = e;
    p->next = S;
    S = p;
}

 

出棧

鏈棧在出棧前同樣需要判斷是否空棧,而且還需要釋放出棧元素的空間。

Elemtype Pop(LinkStack &S, Elemtype &e)
{
    if(S == NULL) exit(-1);

    e = S->data;

    StackNode *p = S;    /*用p臨時儲存出棧結點的空間,以備釋放*/

    S = S->next;

    delete p;            /*使用完出棧元素,可以釋放空間*/

    return e;            /*返回出棧元素資訊*/
}

 

取棧頂元素

棧非空,取元素,棧頂指標不變。

Elemtype GetTop(LinkStack S, Elemtype &e)
{
    if(S != NULL)
        return S->data;
}