首页 > 编程语言 >链式栈接口程序

链式栈接口程序

时间:2024-04-26 20:23:04浏览次数:16  
标签:Top 程序 接口 next StackNode 链式 push data

链式栈接口程序

目录

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

图解

image

头文件

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

标签:Top,程序,接口,next,StackNode,链式,push,data
From: https://www.cnblogs.com/ljw-boke/p/18160799

相关文章

  • C语言数据结构:链式队列的创建及其出入队操作
    /**********************************************************************************************************该程序实现链式队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链式队列中元素*的数据类型为DataType_t,用户可以根据实际情况修改......
  • 顺序循环队列的接口设计
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况......
  • 双向循环链表队列的接口设计
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况......
  • 循环队列的程序接口
    循环队列的程序接口目录循环队列的程序接口队列的说明队列循环队列入队、出队头文件创建队空、队满的判断入队出队验证队列的说明队列循环队列入队、出队头文件/********************************************************************* filename: 循环队列的接口......
  • nginx 配置https,并适配微信小程序
    前言最近接手了个小程序项目,但是由于交接文档不完善,于昨天上午域名证书过期,导致无法调用后端服务,短暂(五分钟左右)影响了小程序的使用,也算是一个不大不小的事故吧[手动捂脸笑...]解决过程临时处理发现是证书过期导致的问题,立马就上阿里云申请新的证书,五分钟左右,证书就签发下来......
  • spring-接口大全
    1.Bean相关1.InitializingBeanInitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。demo@ComponentpublicclassMyInitBeanimplementsInitializingBean{publicvoidafterPro......
  • PHP身份实名认证接口小白也能轻松实现,ocr接口
    还在为网站用户的身份验证头疼不已?不要慌,今天就带你揭秘如何用PHP语言快速搭建起安全可靠的身份实名认证接口系统!只需对接身份证实名认证接口即可轻松实现用户身份的实名认证。那么,如何用PHP语言实现呢?其实很简单,登录翔云,找到开发者中心,下载所需要的接口开发语言,只需更......
  • Optimizing Nintendo 64 Code with Kaze Emanuar——程序员-听播客-学英语-02
    主题:OptimizingNintendo64CodewithKazeEmanuar来源/音频链接:https://softwareengineeringdaily.com/2024/04/05/bonus-episode-optimizing-nintendo-64-code-kaze-emanuar/全文(带中文翻译和注释):EPISODE1666[INTRODUCTION][0:00:00.0]ANNOUNCER:KazeEmanuarisaRO......
  • 基于禅道restful接口的二次开发-获取token
    使用禅道的时候,可能会想用禅道的接口来做一些二次开发,比如获取缺陷情况、案例执行情况,做一些统计报表的展示。根据禅道开发文档中相关说明,在禅道开源版16.0+,专业版11.0+,企业版6.0+,旗舰版2.4+新增RESTful风格API,因此可以利用api来获取相关的数据访问地址:http://****/zentao/a......
  • qt封装dll并静态调用其它接口
    开发套件为QT5.9+MinGW编译器首先创建dll,第一步创建一个打开pro文件,因为我们创建的是app,需要的是dll,修改app->lib,注意不是dll其次,静态调用自己的底层库在工程中加入头文件,在pro添加dll的路径(注意这里静态调用没有用到lib文件)添加示例接口将编译的dll放入测试环境......