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

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

相关推荐
j_xxx404_4 分钟前
C++算法:一维/二维前缀和算法模板题
开发语言·数据结构·c++·算法
x_xbx8 分钟前
LeetCode:111. 二叉树的最小深度
算法·leetcode·职场和发展
入目星河滚烫15 分钟前
网易互娱2020校招在线笔试—游戏研发第一批—游泳池-研发
算法·笔试·数据结构与算法
xier_ran17 分钟前
【第一周】关键词解释:倒数排名融合(Reciprocal Rank Fusion, RRF)算法
开发语言·python·算法
spiritualfood20 分钟前
蓝桥杯大学b组水质检测
c语言·c++·算法·青少年编程·职场和发展·蓝桥杯
进击的小头38 分钟前
第6篇:贝尔曼最优化理论
python·算法·动态规划
EQUINOX144 分钟前
bitset + meet in the middle,P3067 [USACO12OPEN] Balanced Cow Subsets G
算法
四处炼丹1 小时前
OpenClaw本地部署与Multi-Agent 技术分享
人工智能·算法·aigc·agent·ai编程
Σίσυφος19001 小时前
周期 Pattern Removal 算法
算法
飞Link1 小时前
深度捕捉时序本质:TSTD 异常检测之表示学习(Representation-based)全解析
学习·算法·数据挖掘·回归