链式栈实现
#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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用