栈的链式存储结构与顺序存储结构开口方向应相反,因为对链表的头部操作会减少对链表的遍历,所以我们选用第二种结构
同时我们基于线性表的链式存储实现栈的链式存储,线性表的链式存储实现见:https://blog.csdn.net/qq_33185566/article/details/99684151
linkstack.h文件
#include "stdio.h"
#include "linklist.h"
typedef void LinkStack;
typedef struct _tag_LinkStackNode
{
LinkListNode node;//链表的节点
void* item;//栈的节点
}TLinkStackNode;
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);
linkstack.c文件
#include "linkstack.h"
//创建链式栈,相当于创建一个链式线性表
LinkStack* LinkStack_Create()
{
return LinkList_Create();
}
//销毁线性表
void LinkStack_Destroy(LinkStack* stack)
{
LinkStack_Clear(stack);
LinkList_Destroy(stack);
}
//清空一个栈,相当于清空一个链表
//清空栈的时候栈元素声明周期的管理
//所有入栈的节点都是malloc,若要清空栈,需要把所有的元素弹出,并释放节点内存
void LinkStack_Clear(LinkStack* stack)
{
if (stack == NULL)
{
return;
}
while(LinkStack_Size(stack) > 0)
{
LinkStack_Pop(stack);//在此释放节点内存
}
return ;
}
//向栈中添加元素,相当于向线性表的头部插入元素
int LinkStack_Push(LinkStack* stack, void* item)
{
TLinkStackNode* node = NULL;
int rec = 0;
node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
if (node == NULL)
{
return -1;
}
memset(node,0,sizeof(TLinkStackNode));
node->item = item;
rec = LinkList_Insert(stack,(LinkListNode*)node,0);
if (rec != 0)
{
if (node != NULL)
{
free(node);
}
return -1;
}
return 0;
}
//从栈中弹出元素,相当于从线性表的头部删除元素
void* LinkStack_Pop(LinkStack* stack)
{
void* item;//栈的业务节点
TLinkStackNode* tem = NULL;
tem = (TLinkStackNode*)LinkList_Delete(stack,0);
if (tem == NULL)
{
return NULL;
}
item = tem->item;//把线性表的业务节点转换成栈的业务节点
//因为LinkList_Insert的时候分配了内存,所以LinkList_Delete释放内存
free(tem);
return item;
}
//获取栈顶元素,相当于获取链表的第一个元素
void* LinkStack_Top(LinkStack* stack)
{
void* item = NULL;
TLinkStackNode* node = NULL;
if (stack == NULL)
{
return NULL;
}
node = (TLinkStackNode*)LinkList_Get(stack,0);
if (node == NULL)
{
return NULL;
}
item = node->item;
return item;
}
//求栈的大小
int LinkStack_Size(LinkStack* stack)
{
if (stack == NULL)
{
return -1;
}
return LinkList_Length(stack);
}
main.c文件
#include "stdio.h"
#include "linkstack.h"
void main()
{
int i = 0;
int a[10];
LinkStack* stack = NULL;
stack = LinkStack_Create();
if (stack == NULL)
{
return ;
}
//添加元素
for (i = 0; i< 10 ;i++)
{
a[i] = i + 1;
LinkStack_Push(stack,&a[i]);
}
printf("len:%d\n",LinkStack_Size(stack));
printf("top:%d ",*((int *)LinkStack_Top(stack)));
printf("\n");
//删除元素
while(LinkStack_Size(stack) > 0)
{
int tem = *((int*)LinkStack_Pop(stack));
printf("tem:%d ",tem);
}
printf("\n");
//销毁栈
LinkStack_Destroy(stack);
system("pause");
}
输出结果: