链式栈接口程序

链式栈接口程序

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

图解

头文件

/*******************************************************************
 *
 *	file name:	链式栈的接口
 *	author	 :  [email protected]
 *	date	 :  2024-4-26
 *	function :	双向循环链表的接口
 * 	note	 :  None
 *
 *	CopyRight (c)  2024-4-26   [email protected]   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	 :  [email protected]
 *	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	 :  [email protected]
 *	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	 :  [email protected]
 *	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	 :  [email protected]
 *	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

热门相关:恐怖复苏   天王的专属恋人:独家宝贝   99次出墙:老公,情难自禁   聊斋大圣人   明尊