基本數據結構之—鏈式棧
鏈式棧-其實簡單的理解就是一個受到操作限制的單向鏈表,因為棧只有簡單的一些操作,比如:入棧,出棧,獲取棧頂,棧的清空等
先分析一下棧的基本數據吧
棧作為一種容器,那么需要存儲數據的地方,為了方便,只存儲數據的開始地址是一個不錯的選擇
為了快速的知道棧的長度,我們在維護一個長度的參數,和順序棧的區別是我們不用考慮容量的問題
當然你也可以維護更多的參數來支持你想要的操作。
棧的鏈式存儲,底部使用的是鏈表的知識。為了方便操作和提升性能,我們將鏈表的頭結點當做棧頂。
為了有個統一的結點來傳遞地址,直接定義一個指針
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;
}