链式栈实现

复制代码
#include <stdlib.h>
#include <assert.h>

typedef void* element_t;

struct stack_node_t {
        element_t data;
        struct stack_node_t* prev;      // 指向前一个元素,方向是向栈底
};

struct stack_t {
        struct stack_node_t* base;
        struct stack_node_t* top;
        int size;
};

int stack_init(struct stack_t* s) {
        assert(NULL != s);

        s->base = NULL;
        s->top  = NULL;
        s->size = 0;
        return 0;
}

struct stack_t* stack_create(void) {
        struct stack_t* s = (struct stack_t *)malloc(sizeof(*s));
        if (!s) {
                printf("memory allocated error");
                return NULL;
        }

        stack_init(s);
        return s;
}

int stack_push(struct stack_t* s, element_t data) {
        struct stack_node_t* node = NULL;
        
        assert(NULL != s);

        node = (struct stack_node_t *)malloc(sizeof(*node));
        if (!node) {
                printf("memory allocated error");
                return -1;
        }

        node->data = data;
        if (!s->base)
                s->base = node;

        node->prev = s->top;
        s->top = node;
        s->size++;
        return 0;
}

int stack_pop(struct stack_t* s, element_t* data) {
        struct stack_node_t* tmp = NULL;

        assert(NULL != s);
        assert(NULL != data);

        tmp = s->top;
        if (!tmp)
                return -1;

        *data = tmp->data;
        s->top = tmp->prev;
        free(tmp);
        s->size--;
        return 0;
}

int stack_is_empty(struct stack_t* s) {
        assert(NULL != s);

        if (s->size)
                return 0;
        else
                return 1;
}
复制代码

还有一种更简单的实现,没有使用单独的类型表示栈对象,但是会给某些操作带来额外的开销,比如检查栈的元素个数,或者直接访问栈底等等,

复制代码
/*
 *      链式栈的实现
 *      NULL <- base <- ... <- top
 */

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef void* element_t;

struct stack_node_t {
        element_t data;
        struct stack_node_t* prev;
};

void stack_init(struct stack_node_t** s) {
        assert(NULL != s);
        *s = NULL;
}

int stack_push(struct stack_node_t** s, element_t data) {
        struct stack_node_t* s_node;

        assert(NULL != s);

        s_node = (struct stack_node_t *)malloc(sizeof(*s_node));
        if (!s_node) {
                printf("memory allocated error");
                return -1;
        }

        s_node->data = data;
        s_node->prev = *s;
        *s = s_node;
        return 0;
}

int stack_pop(struct stack_node_t** s, element_t* data) {
        struct stack_node_t* tmp;
        
        assert(NULL != s);

        tmp = (*s);
        if (!tmp)
                return -1;
        *data = tmp->data;
        *s = tmp->prev;
        free(tmp);
        return 0;
}
复制代码
posted @   WendellYih  阅读(277)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示