栈的链式存储结构

栈的链式存储结构与顺序存储结构开口方向应相反,因为对链表的头部操作会减少对链表的遍历,所以我们选用第二种结构

同时我们基于线性表的链式存储实现栈的链式存储,线性表的链式存储实现见: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");
}

输出结果:

https://blog.csdn.net/weixin_42119041/article/details/102476889?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158582040319725219931973%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158582040319725219931973&biz_id=0&utm_source=distribute.pc_search_result.none-task

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值