栈的链式存储结构的简单实现

本文详细介绍了链栈的基本概念,包括链栈的定义、结构和关键操作的实现,如初始化、压栈、出栈、获取栈顶元素及销毁函数。通过具体的代码示例,深入解析了链栈在数据结构中的作用。

上一篇博客我们进行了栈的顺序存储结构的简单实现,这一篇博客进行栈的链式存储结构的简单实现
一、链栈的定义
我们都知道栈有栈顶指针,链表有头指针,这两者是缺一不可的,所以在进行链栈的设计的时候,我们就把栈顶放在单链表的头部。从而方便我们的插入和删除的操作。那么链栈的基本结构如下所示:
在这里插入图片描述

二、链栈的简单实现
1、链栈的整体结构的定义

typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}Node,stack,*pstack;

2、初始化(init)

void init(pstack pst)
{
	if(pst != NULL)
	{
	pst->next = NULL;
	}
}

3、压栈(push)
因为链栈不存在栈满的情况,除非是我们的内存不够使用了。所以我们不需要写判满函数。但是由于我们要插入一个结点,所以我们就需要生成一个新的结点,所以我们就需要写购买结点的函数。

Node* buyNode(ElemType val)
{
	Node* pnewnode = (Node*)malloc(sizeof(Node));
	pnewnode->data = val;
	pnewnode->next = NULL;
}

插入元素的操作如下图所示:
在这里插入图片描述
代码实现

void push(pstack pst,ElemType val)//元素做一个链表的头插
{
	Node* pnewnode = buyNode(val);
	pnewnode->next = pst->next;
	pst->next = pnewnode;
}

4、出栈(pop)
在进行出栈操作之前我们需要对链栈进行判空的操作,如果栈里面没有元素,就不能进行删除元素的操作。

int empty(pstack pst)
{
	return pst->next == NULL ?  1 : 0;
}

删除元素的操作如下图所示:
在这里插入图片描述
代码实现:

int pop(pstack pst)
{
	if(empty(pst))
	{
	return 0;
	}
	Node* pcur = pst->next;//第一个数据结点
	pst->next = pcur->next;
	free(pcur);
	return 1;
}

5、获取栈顶元素(gettop)

int gettop(patsck pst,ElemType* prt)
{
	if(empty(pst))
	{
	return 0;
	}
	*prt = pst->next->data;//第一个数据结点的数据
	return 1}

6、销毁函数(destory)
因为链栈所以我们最后得设计摧毁函数

void destory(pstack pst)
{
	Node* pcur = pst->next;
	Node* pnext = NULL;
	while(pcur !=NULL)
	{
	pnext = pcur->next;
	free(pcur);
	pcur = pnext;
	}
	pst->next = NULL;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值