链栈的接口设计

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//指的是链栈中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录链栈LinkStackk各项参数(节点的数据与+直接前驱的指针域)的结构体
typedef struct LinkStack
{
    DataType_t  		     data; //结点的数据域
	struct LinkStack	*next; //直接前驱的指针域

}LKStack_t;


//创建顺序表并对链栈进行初始化
LKStack_t * LKStack_Create(void)
{
	//1.利用calloc为链栈的管理结构体申请一块堆内存
	LKStack_t *Top = (LKStack_t *)calloc(1,sizeof(LKStack_t));

	if(NULL == Top)
	{
		perror("calloc memory for manager is failed");
		exit(-1); //程序异常终止
	}

	Top->next=NULL;
	
	return Top;
}

//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LKStack_t * LKStack_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	LKStack_t *New = (LKStack_t *)calloc(1,sizeof(LKStack_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域的2个值进行初始化,指针域指向结点自身,体现“循环”
	New->data = data;
	New->next = NULL;

	return New;
}

//判断链栈是否为空
bool LKStack_IsEmpty(LKStack_t *Top)
{
	return (Top->next==NULL) ? true : false;
}


//入栈
bool LKStack_Push(LKStack_t *Top, DataType_t Data)
{
    LKStack_t* Ptop=Top->next;
    LKStack_t *New = LKStack_NewNode(Data);
	
    New->next=Ptop;
    Top->next=New;

	return true;
}


//出栈
DataType_t LKStack_Pop(LKStack_t *Top)
{
	DataType_t temp = 0;  //用于存储出栈元素的值
    LKStack_t* Ptop=Top->next;
	//1.判断链栈是否为空
	if ( LKStack_IsEmpty(Top) )
	{
		printf("LKStack is Empty!\n");
		return;
	}
	
	//2.由于删除了一个元素,则需要让链栈的栈顶元素下标-1
	temp=Ptop->data;
    Top->next=Ptop->next;

	return temp;
}


//遍历链栈的元素
void LKStack_Print(LKStack_t *Top)
{
    LKStack_t* Ptop=Top;
	while(Ptop->next!=NULL)
    {
        Ptop=Ptop->next;
        printf("data=%d\n",Ptop->data);
    }
}


int main(int argc, char const *argv[])
{

	//1.创建链栈
	LKStack_t * Top = LKStack_Create();
	

	//2.向链栈中插入新元素
	printf("*********************************入栈********************************\n");
	LKStack_Push(Top,5);
	LKStack_Push(Top,2);
	LKStack_Push(Top,1);
	LKStack_Push(Top,4);
	LKStack_Push(Top,6);  


	// //3.遍历链栈
	LKStack_Print(Top); // -- 5 2 1 4 6
	printf("\n");
	//4.向链栈中插入新元素
	printf("*********************************出栈********************************\n");
	printf("出栈元素为%d\n",LKStack_Pop(Top));
	printf("出栈元素为%d\n",LKStack_Pop(Top));
	printf("出栈元素为%d\n",LKStack_Pop(Top));
	printf("出栈元素为%d\n",LKStack_Pop(Top));
	printf("出栈元素为%d\n",LKStack_Pop(Top));  

	// //5.遍历链栈
	LKStack_Print(Top); // --空
	printf("\n");

    //2.向链栈中插入新元素
	printf("*********************************入栈********************************\n");
	LKStack_Push(Top,6);
	LKStack_Push(Top,4);
	LKStack_Push(Top,1);
	LKStack_Push(Top,2);
	LKStack_Push(Top,5);  


	// //3.遍历链栈
	LKStack_Print(Top); // -- 6 4 1 2 5
	printf("\n");
	return 0;
}
posted @ 2024-04-25 14:58  藍桉未遇釋槐鳥  阅读(15)  评论(0)    收藏  举报