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

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

相关推荐
写代码写到手抽筋2 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.2 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
wayz113 小时前
Momentum:PSL(心理线指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
8Qi84 小时前
LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
算法·leetcode·职场和发展·动态规划
三品吉他手会点灯4 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
乐迪信息4 小时前
乐迪信息:AI算法盒子实时识别船舶烟雾与火焰异常
大数据·人工智能·算法·安全·目标跟踪
J-Tony114 小时前
【JVM】根可达算法
jvm·算法
艾iYYY4 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法
Lsk_Smion5 小时前
力扣实训 _ [75].颜色分类 _ 杨辉三角
数据结构·算法·leetcode