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

数据结构

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

/*****************************************************************************************************************
*	
*	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

posted @ 2024-04-25 21:22  陳文鹏  阅读(21)  评论(0编辑  收藏  举报