栈的链式结构是用以前实现的可复用的单链表实现的,和栈的顺序结构区别仅仅在储存结构方面
实现代码:
定义的头文件:
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
typedef void LinkStack;
typedef struct _tag_LinkStackNode LinkStackNode;
struct _tag_LinkStackNode
{
LinkStackNode* next;
};
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
实现的c文件:
#include "LinkStack.h"
#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
typedef struct _tag_LinkStack
{
LinkStackNode header;
void *item;
}TLinkStackNode;
//创建一个链栈的头节点(相当于链表的头节点)
LinkStack *LinkStack_Create()
{
return LinkList_Create();
}
//销毁一个链栈
void LinkStack_Destroy(LinkStack *stack)
{
LinkStack_Clear(stack);
LinkList_Destory(stack);
}
//清空链栈
void LinkStack_Clear(LinkStack *stack)
{
while( Linkstack_Size(stack) > 0)
{
LinkStack_Pop(stack);
}
}
//压栈 (从头部插入)
int LinkStack_Push(LinkStack *stack,void *item)
{
//申请一个链栈的结构
TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
int ret;
//合法性判断
ret = (node != NULL) && (item != NULL);
if (ret)
{
node->item = item;
ret = LinkList_Insert(stack, (LinkListNode *)node, 0);
}
if( !ret )
{
free(node);
}
return ret;
}
//弹栈
void *LinkStack_Pop(LinkStack *stack)
{
TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete( stack, 0);//得到栈顶的元素
void *ret = NULL;
//不为空,释放申请的空间
if(node != NULL)
{
ret = node->item;
free(node);
}
return ret;
}
//得到栈顶元素
void *LinkStack_Top(LinkStack *stack)
{
TLinkStackNode* node = (TLinkStackNode*) LinkList_Get(stack, 0);
void *ret = NULL;
//不为空,得到栈顶的数据
if(node != NULL)
{
ret = node->item;
}
return ret;
}
//得到栈的大小
int Linkstack_Size(LinkStack *stack)
{
return LinkList_Length(stack);
}
测试代码:
#include <stdio.h>
#include "LinkStack.h"
int main(int argc, char *argv[])
{
int a[10] = {0};
int i;
LinkStack *stack = LinkStack_Create();
for(i=0; i< 10; i++)
{
a[i] = i;
LinkStack_Push(stack,a+i);
}
printf("Top:%d\n",*(int*)LinkStack_Top(stack));
printf("Length:%d\n",Linkstack_Size(stack));
while(Linkstack_Size(stack) > 0)
{
printf("Pop:%d\n",*(int*)LinkStack_Pop(stack));
}
LinkStack_Destroy(stack);
printf("Press enter to continue ...");
getchar();
return 0;
}