首页 > 其他分享 >以链表作为基础实现栈空间(链式栈)

以链表作为基础实现栈空间(链式栈)

时间:2024-04-25 21:35:27浏览次数:24  
标签:结点 Head 栈头 next 链表 LStack 链式 空间

数据结构

以链表作为基础实现栈空间(链式栈)

/*****************************************************************************************************************
*	
*	file name	:	LinkedStack.c
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/25
*	function	:	链式栈的接口程序
*	note	 	:	None
* 	
*  	CopyRight (c)	2024	cnzycwp@126.com 	All Right Reseverd
*
* ****************************************************************************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//指的是链式栈中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录链式栈LinkedStack各项参数(栈底地址+栈顶元素的数据域)的结构体
typedef struct LinkedStack
{
	
    DataType_t  		 data;       //记录栈顶元素的数据域
	struct LinkedStack	*next;    //记录栈底地址	

}LStack_t;

//创建一个空链式栈,空链式栈应该有一个栈头结点,对链式栈进行初始化
LStack_t * LStack_Create(void)
{
	//1.创建一个栈头结点并对栈头结点申请内存
	LStack_t *Head = (LStack_t *)calloc(1,sizeof(LStack_t));
	if (NULL == Head)
	{
		perror("Calloc memory for HeadStack is Failed");
		exit(-1);
	}

	//2.对栈头结点进行初始化,栈头结点是不存储有效内容的!!!
	Head->next = NULL;

	//3.把栈头结点的地址返回即可
	return Head;
}

//创建新的栈结点,并对新栈结点进行初始化(栈底地址+栈顶元素的数据域)
LStack_t * LStack_NewNode(DataType_t data)
{
	//1.创建一个新栈结点并对新栈结点申请内存
	LStack_t *New = (LStack_t *)calloc(1,sizeof(LStack_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNodeStack is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}

//入栈
bool LStack_Push(LStack_t *Head,DataType_t data)
{
	//1.创建新的结点,并对新结点进行初始化
	LStack_t *New = LStack_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node for stack\n");
		return false;
	}
	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的头部
	New->next  = Head->next;
	Head->next = New;

	return true;
}

//出栈
DataType_t LStack_Pop(LStack_t *Head)
{
    DataType_t temp = 0;

    //1.判断当前链式栈是否为空,为空则直接退出
	if (Head->next == NULL)
	{
		printf("current linkedstack is empty!\n");
		return -1;
	}

    //2.如果当前链式栈为非空,则删除当前链式栈的栈头结点
    LStack_t *Phead = Head->next; //备份栈头结点地址

    Head->next = Head->next->next;   //把栈头结点的next指针指向栈首结点的直接后继

    Phead->next = NULL;           //把栈首结点的next指针指向NULL

    temp = Phead->data;              //出栈顶的元素数据域

    return temp;
}

//遍历链式栈的元素
void LStack_Print(LStack_t *Head)
{
	//对链式栈的头文件的地址进行备份
	LStack_t *Phead = Head;
	
	//栈顶
	while(Phead->next)
	{
		//把栈头结点的直接后继作为新的栈头结点
		Phead = Phead->next;

		//输出栈头结点的直接后继的数据域
		printf("%d->",Phead->data);
	}

}


int main(int argc, char const *argv[])
{
	LStack_t *Head = LStack_Create();

    //入栈
    LStack_Push(Head,1);
    LStack_Push(Head,20);
    LStack_Push(Head,3);
    LStack_Push(Head,5);
    LStack_Push(Head,85);
    LStack_Print(Head);
    printf("\n");

    // //出栈
    printf("%d\n",LStack_Pop(Head));
    printf("%d\n",LStack_Pop(Head));
    LStack_Print(Head);
    printf("\n");


	return 0;
}

结果验证:

image

标签:结点,Head,栈头,next,链表,LStack,链式,空间
From: https://www.cnblogs.com/cwp-home/p/18158625

相关文章

  • 单链表的头插、尾插、中间插、头删、尾删、中间删
    //指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表的结点,链表中所有结点的数据类型应该是相同的typedefstructLinkedList{ DataType_t data;//结点的数据域 structLinkedList *next;//结点的指针域}LList_t;......
  • 单向链表的学习
    单向链表的学习链表:链式存储的线性表。单向链表的优缺点优点插入、删除时只需要调整几个指针,无需移动任何数据当数据节点数量较多时,无需一整片较大的连续内存空间,可以灵活利用离散的内存当数据节点数量变化剧烈时,内存的释放和分配灵活,速度快缺点在节点中,需要多余的指......
  • 双向链表的学习
    双向链表的学习经过单链表、双链表的学习,可以总结链表的适用场合:适合用于节点数目不固定,动态变化较大的场合适合用于节点需要频繁插入、删除的场合适合用于对节点查找效率不十分敏感的场合双向链表的增删改查实现双向链表的初始化//指的是双向链表中的节点有效数据......
  • 双向循环链表的增删改查功能
    数据结构双向循环链表双向循环链表的增删改查/****************************************************************************************************************** * filename : DoubleCirLinkedList.c* author : cnzycwp@126.com* data : 2024/04/24* funct......
  • 基于c语言数据结构-双循环链表
    DoubleCircularLinkedList双循环链表/**************************************************************函数名称:*函数功能:设计双向循环链表的接口*函数参数:*返回结果:*注意事项:None*函数作者:zcx982795194@163@163.com*创建日期:2024/04/25*修......
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)
    版本:2024年4月25日V1.0发布于博客园/***@filename:CircularLinkedList.c*@brief:实现单向循环链表的相关功能*@author:RISE_AND_GRIND@163.com*@date:2024/04/25*@version:1.1*@note:*CopyRight(c)2023-2024RISE_A......
  • 数据结构——双向循环链表
    二、双向循环链表(一)双向循环链表的构造双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。1)构造双向循环链表的结点//双向链表中的结点有效数据类型,用户可以根据需要进行修......
  • 双向循环链表的插入和删除
    数据结构线性表--双向循环链表操作**注意!!!**怎么说,今天(2024.4.24)找一个小小的运行bug(没有报错)找了非常之久,明天继续把这些代码补齐,啊啊啊,但是感谢还是把这个bug找出来(这段话我不会删的)~~测试该程序的相关头文件和定义以及相关函数最后一个代码块。/****************......
  • Ubuntu20文件系统磁盘空间不足low disk space on filesystem root——转载
      Ubuntu20文件系统磁盘空间不足lowdiskspaceonfilesystemroot天然玩家于2022-07-2307:45:00发布阅读量1w 收藏 132点赞数41分类专栏: #Ubuntu 文章标签: filesystem gparted ubuntu版权Ubuntu专栏收录该内容19篇文章1......
  • 双向链表
    /**************************************************************************************设计双向链表的接口***Copyright(c)2023-2024cececlmx@126.comAllrightReserved*************************************************************************......