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

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

相关推荐
️是7811 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法
Liangwei Lin12 小时前
LeetCode 118. 杨辉三角
算法·leetcode·职场和发展
计算机安禾12 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
鼠鼠我(‘-ωก̀ )好困12 小时前
leetGPU
算法
我星期八休息12 小时前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法
池塘的蜗牛12 小时前
A Low-Complexity Method for FFT-based OFDM Sensing
算法
故事和你9113 小时前
洛谷-【图论2-1】树5
开发语言·数据结构·c++·算法·动态规划·图论
咖啡里的茶i13 小时前
视觉显著目标的自适应分割与动态网格生成算法研究
人工智能·算法·目标跟踪
paeamecium13 小时前
【PAT甲级真题】- String Subtraction (20)
数据结构·c++·算法·pat考试·pat
YL2004042613 小时前
047从前序与中序遍历序列构造二叉树
算法·leetcode