【数据结构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)旧节点

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

相关推荐
xiaoye-duck1 小时前
《算法题讲解指南:优选算法-双指针》--01移动零,02复写零
c++·算法
田里的水稻1 小时前
LPC_激光点云定位(LSLAM)-(IPC)
人工智能·算法·数学建模·机器人·自动驾驶
额,不知道写啥。2 小时前
P5314 ODT(毒瘤树剖)
数据结构·c++·算法
CHANG_THE_WORLD2 小时前
深入指针5:回调函数与泛型排序
数据结构·算法
qq_454245032 小时前
计算机与AI领域中的“上下文”:多维度解析
数据结构·人工智能·分类
今儿敲了吗2 小时前
24| 字符串
数据结构·c++·笔记·学习·算法
Wect2 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:题解与思路解析
前端·算法·typescript
小雨中_2 小时前
2.5 动态规划方法
人工智能·python·深度学习·算法·动态规划
小龙报2 小时前
【51单片机】不止是调光!51 单片机 PWM 实战:呼吸灯 + 直流电机正反转 + 转速控制
数据结构·c++·stm32·单片机·嵌入式硬件·物联网·51单片机