鏈式棧總結


基本數據結構之—鏈式棧

鏈式棧-其實簡單的理解就是一個受到操作限制的單向鏈表,因為棧只有簡單的一些操作,比如:入棧,出棧,獲取棧頂,棧的清空等

 

先分析一下棧的基本數據吧

棧作為一種容器,那么需要存儲數據的地方,為了方便,只存儲數據的開始地址是一個不錯的選擇

為了快速的知道棧的長度,我們在維護一個長度的參數,和順序棧的區別是我們不用考慮容量的問題

當然你也可以維護更多的參數來支持你想要的操作。

棧的鏈式存儲,底部使用的是鏈表的知識。為了方便操作和提升性能,我們將鏈表的頭結點當做棧頂。

 

為了有個統一的結點來傳遞地址,直接定義一個指針

typedef struct _STACKNODE

{

    struct _STACKNODE *Next;

}StackNode;

 

棧的基本結構

 

typedef struct _LINKSTACK

{

    // 棧的數據(其實是地址)

    StackNode Head;

    // 棧的長度

    int Size;

}LinkStack;

 

先判斷現在棧的結點的情況,如果為空,則開辟一個空間。

//初始化

int Init_LinkStack(void **linkstack)

{

    if (linkstack == NULL)

    {

        exit(-1);

    }

 

    // 將數據類型進行轉化,便於后面的操作

    LinkStack **stack = (LinkStack **)linkstack;

   

    // 檢查棧是否已經有可用的內存

    if (*stack == NULL)

    {

        *stack = (LinkStack *)malloc(sizeof(LinkStack));

    }

    // 對開辟空間的檢測

    if (*stack == NULL)

    {

        exit(-2);

    }

   

    // 將數據和長度初始化

    (*stack)->Head.Next = NULL;

    (*stack)->Size = 0;

 

    return 0;

}

 

入棧操作就是將數據的頭指針的數據 (地址)和加入數據(地址)做一個交換

// 入棧

int Push_LinkStack(void *linkstack, void *Data)

{

    if (linkstack == NULL)

    {

        return -1;

    }

    if (Data == NULL)

    {

        return -2;

    }

 

    // 將數據類型進行轉化,便於后面的操作

    LinkStack *stack = (LinkStack *)linkstack;

    StackNode *data = (StackNode *)Data;

   

    data->Next = stack->Head.Next;

    stack->Head.Next = data;

    ++stack->Size;

 

    return 0;

}

 

將第一個位置的元素指向下一個位置,如果長度為0,就不操作

// 出棧

int Pop_LinkStack(void *linkstack)

{

    if (linkstack == NULL)

    {

        return -1;

    }

    // 將數據類型進行轉化,便於后面的操作

    LinkStack *stack = (LinkStack *)linkstack;

   

    // 棧為空,不能出棧

    if (stack->Size == 0)

    {

        return -2;

    }

    else

    {

        stack->Head.Next = stack->Head.Next->Next;

        --stack->Size;

    }

    return 0;

}

 

// 返回棧頂元素

void *Top_LinkStack(void *linkstack)

{

    if (linkstack == NULL)

    {

        return NULL;

    }

    // 將數據類型進行轉化,便於后面的操作

    LinkStack *stack = (LinkStack *)linkstack;

 

    // 棧為空,不能出棧

    if (stack->Size == 0)

    {

        return NULL;

    }

    // 返回第一個元素

    return stack->Head.Next;

}

 

棧的大小

int Size_LinkStack(void *linkstack)

{

    if (linkstack == NULL)

    {

        return 0;

    }

    // 將數據類型進行轉化,便於后面的操作

    LinkStack *stack = (LinkStack *)linkstack;

    return stack->Size;

}

 

// 銷毀棧

int Destory_LinkStack(void *linkstack)

{

    if (linkstack == NULL)

    {

        return -1;

    }

    // 將數據類型進行轉化,便於后面的操作

    LinkStack *stack = (LinkStack *)linkstack;

 

    if (stack->Head.Next != NULL)

    {

        stack->Head.Next = NULL;

    }

    stack->Size = 0;

    return 0;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM