【数据结构7】链式栈实现

目录

一、节点结构、头结构

二、链式栈主要接口

三、链式栈具体接口实现

[3.1 创建链式栈](#3.1 创建链式栈)

[3.2 压栈](#3.2 压栈)

[3.3 弹栈](#3.3 弹栈)

[3.4 释放链式栈](#3.4 释放链式栈)


一、节点结构、头结构

复制代码
C

//节点结构
typedef struct _node
{
    Element data;
    struct _node *next;
}StackNode;
//头结构
typedef struct
{
    StackNode *top;
    int count;
}LinkStack;

这里头结构为什么要封装成结构体形式?

你想想,如过不封装成结构体,实现新元素插入将会如下:

void insertE(node *top,Element val){

node *new_node = malloc();

new_node->next = top;

top = new_node; // 函数是值传递无法完成更新

}

而如果将*top封装进结构体如上,实现就会通过结构体间接访问,完成值的修改

二、链式栈主要接口

复制代码
C

LinkStack *createLinkStack();
void releaseLinkStack(LinkStack *stack);

int pushLinkStack(LinkStack *stack,Element e);
int popLinkStack(LinkStack *stack,Element *e);

分别是创建链式栈、释放链式栈、压栈、弹栈几个接口

三、链式栈具体接口实现

3.1 创建链式栈
复制代码
C

LinkStack* createLinkStack()
{
    LinkStack *link_stack = malloc(sizeof(LinkStack));
    if (link_stack == NULL)
    {
        fprintf(stderr,"LinkStack malloc failed\n");
        return NULL;
    }
    link_stack->top = NULL;
    link_stack->count = 0;

    return link_stack;
}

栈顶初始指向空,不存在任何节点

3.2 压栈
复制代码
C

int pushLinkStack(LinkStack* stack, Element e)
{
    StackNode* node = malloc(sizeof(StackNode));
    if (node == NULL)
    {
        fprintf(stderr, "Node malloc failed\n");
        return -1;
    }
    node->data = e;
    node->next = stack->top;
    stack->top = node;
    ++stack->count;

    return 0;
}

这里的node->next = stack->top

stack->top = node;

意思是将新插入的节点的next指针,指向栈顶

将栈顶更新为新插入的节点,如下图:

3.3 弹栈
复制代码
C

int popLinkStack(LinkStack* stack, Element *e)
{
    if (stack->top == NULL)
    {
        printf(stderr,"stack empty\n");
        return -1;
    }
    *e = stack->top->data;
    StackNode *tmp = stack->top;
    stack->top = tmp->next;
    free(tmp);
    --stack->count;

    return 0;
}

1、这块意思是*e存现在栈顶元素,通过指针参数返回值

为什么不是直接return?空栈时无法返回有效值

2、tmp指向栈顶,将栈顶更新为原栈顶的后一个元素

将原来的栈顶释放

3.4 释放链式栈
复制代码
C

void releaseLinkStack(LinkStack* stack)
{
    if (stack)
    {
        while (stack->top)
        {
            StackNode *tmp = stack->top;
            stack->top = tmp->next;
            free(tmp);
            --stack->count;
        }
        printf("stack count : %d\n",stack->count);
    }
}

是站在栈顶不断删元素:

不断更新stack->top、不断free(tmp)旧节点

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
叠层归一研究院1 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia2 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6663 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin033 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao4 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水4 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
雨落在了我的手上5 小时前
Java数据结构(十四):Map和Set
数据结构
码行山野赴时序归途5 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
别动我齐刘海6 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11336 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu