1、基本概念
鏈式棧是一種特殊的鏈表,下面實現的代碼是基於鏈表而來的,請參考前幾篇的博客
linkstack.h
#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Push(LinkStack* stack, void* item);
void* LinkStack_Pop(LinkStack* stack);
void* LinkStack_Top(LinkStack* stack);
int LinkStack_Size(LinkStack* stack);
#endif //_MY_LINKSTACK_H_
linkstack.c
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "linkstack.h"
#include "linklist.h"
typedef struct _tag_LinkStackNode
{
LinkListNode node; //佔位結構。。。只要定義一個和node節大小一樣的數據即可
void *item;
}TLinkStackNode;
//我要創建一個linkstack,準備用linklist去模擬實現
//相當於在 linkstack.c中寫 linklist庫的測試程序。。。。。。
LinkStack* LinkStack_Create()
{
//創建一個棧,通過線性表去模擬。。。(創建一個棧,相當於創建一個線性表)
return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack); //注意 destory的時候,需要把棧中的所有元素都清空
LinkList_Destroy(stack);
}
void LinkStack_Clear(LinkStack* stack)
{
//LinkList_Clear(stack);
while (LinkStack_Size(stack) > 0)
{
LinkStack_Pop(stack); //在這個函數裏面有內存釋放函數
}
return ;
}
//向棧中放元素,相當於 向線性表中插入一個元素
int LinkStack_Push(LinkStack* stack, void* item)
{
int ret = 0;
//需要item數據,轉換成 linklist的業務節點
TLinkStackNode *pTe = (TLinkStackNode *)malloc(sizeof(TLinkStackNode));
if (pTe == NULL)
{
return -1;
}
pTe->item = item;
//頭插法 ,向線性表中插入元素,只不過是插入元素的時候,需要構造業務節點而已。。。。。。
ret = LinkList_Insert(stack, (LinkListNode *)(&pTe->node),0 );
if (ret != 0)
{
free(pTe);
}
return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
void *myItem = NULL;
TLinkStackNode *pTmp = NULL;
pTmp = (TLinkStackNode *)LinkList_Delete(stack, 0);
if (pTmp == NULL)
{
return NULL;
}
myItem = pTmp->item;
//注意向線性表中,插入元素的時,打造節點,分配內存;
//彈出元素時,需要釋放節點內存,不要忘記
if (pTmp != NULL)
{
free(pTmp);
}
return myItem;
}
void* LinkStack_Top(LinkStack* stack)
{
void *myItem = NULL;
TLinkStackNode *pTmp = NULL;
pTmp = (TLinkStackNode *)LinkList_Get(stack, 0);
if (pTmp == NULL)
{
return NULL;
}
myItem = pTmp->item;
return myItem;
}
int LinkStack_Size(LinkStack* stack)
{
return LinkList_Length(stack);
}
測試.c
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "linkstack.h"
void main()
{
int a[10], i;
LinkStack *stack = NULL;
stack = LinkStack_Create();
for (i=0; i<10; i++)
{
a[i] = i+1;
LinkStack_Push(stack, &a[i]);
}
printf("top: %d \n", *((int *)LinkStack_Top(stack)));
printf("size: %d \n", LinkStack_Size(stack));
//刪除棧中所有元素
while (LinkStack_Size(stack) > 0)
{
printf("linkstack pop: %d \n", *((int*)LinkStack_Pop(stack)) );
}
LinkStack_Destroy(stack);
system("pause");
}