链式栈接口程序
链式栈接口程序
以链表作为基础实现栈空间(链式栈)
图解
头文件
/*******************************************************************
*
* file name: 链式栈的接口
* author : 17647576169@163.com
* date : 2024-4-26
* function : 双向循环链表的接口
* note : None
*
* CopyRight (c) 2024-4-26 17647576169@163.com All Right Reseverd
*
* *****************************************************************/
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
链式栈的创建
// 指的是链式栈中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
// 定义链式栈的节点结构体
typedef struct StackNode
{
DataType_t data; // 结点的数据域
struct StackNode *next; // 结点的指针域
} StackNode_t;
/********************************************************************
*
* name : LList_NewNode
* function : 创建一个空的链式栈,链式栈应该有一栈顶,对链表进行初始化
* argument :
*
* retval : 栈顶地址
* author : 17647576169@163.com
* date : 2024-4-26
* note : None
*
* *****************************************************************/
StackNode_t *CreateStack(void)
{
StackNode_t *Top = (StackNode_t *)calloc(1, sizeof(StackNode_t));
if (Top == NULL)
{
printf("Memory allocation failed!\n");
exit(1);
}
Top->next = NULL; // 初始化栈顶为NULL
return Top;
}
创建一个空的链式栈节点
/********************************************************************
*
* name : CreateStackNode
* function : 创建一个空的链式栈节点
* argument :
* retval : LinkStack_t* 链式栈头节点地址
* author : 17647576169@163.com
* date : 2024-4-26
* note : None
*
* *****************************************************************/
StackNode_t *CreateStackNode(DataType_t data)
{
// 1.创建一个新结点并对头结点申请内存
StackNode_t *NewNode = (StackNode_t *)malloc(sizeof(StackNode_t));
if (NewNode == NULL)
{
printf("Memory allocation failed!\n");
exit(1);
}
// 2.对新结点进行初始化
NewNode->data = data;
NewNode->next = NULL;
// 3.把头结点的地址返回即可
return NewNode;
}
入栈
/********************************************************************
*
* name : push
* function : 入栈
* argument : @data:需插入的数据
*
* retval : 返回新创建链表节点的地址
* author : 17647576169@163.com
* date : 2024-4-22
* note :
*
* *****************************************************************/
bool push(StackNode_t *Top, DataType_t data)
{
// 创建新的栈节点
StackNode_t *NewNode = CreateStackNode(data);
if (NULL == NewNode)
{
printf("can not insert new node\n");
return false;
}
NewNode->next = Top->next; // 新节点指向当前栈顶
Top->next = NewNode; // 更新栈顶为新节点
printf("push:%d\n", data); // 入栈打印验证,测试用
return true;
}
出栈
/********************************************************************
*
* name : pop
* function : 出栈操作
* argument :
*
* retval :
* author : 17647576169@163.com
* date : 2024-4-22
* note :
*
* *****************************************************************/
// 出栈操作
DataType_t pop(StackNode_t *Top)
{
DataType_t data = Top->next->data;
// 备份栈顶
StackNode_t *Ptop = Top->next;
if (Top->next == NULL)
{
printf("Stack is empty!\n");
exit(1);
}
Top->next = Ptop->next; // 头节点指向首节点的后继
Ptop->next = NULL; // 首节点指向空
free(Ptop); // 释放首节点
return data;
}
验证
int main(int argc,
char const *argv[])
{
StackNode_t *Top = CreateStack();
push(Top, 1);
push(Top, 2);
push(Top, 3);
push(Top, 4);
printf("%d\n", pop(Top));
printf("%d\n", pop(Top));
printf("%d\n", pop(Top));
printf("%d\n", pop(Top));
return 0;
}
输出结果
push:1
push:2
push:3
push:4
4
3
2
1