从零开始的敲代码生活--数据结构篇(栈)
一、栈基础概念栈结构只允许从一端进行插入和删除数据的线性存储结构称为栈结构。 数据插入和删除的这端称为栈顶另一端称为栈底。 数据的插入称为入栈/压栈数据的删除称为出栈/弹栈。特点 先进后出(FILO)栈的应用解决回溯问题撤销功能、网页撤销功能缓存判断回文字符串判断成对出现的符号有没有丢失栈的分类顺序栈使用顺序存储结构(数组)实现的栈根据栈顶位置与栈的生长方向分为四种满栈、空栈根据所在位置是否存有元素确定栈顶所在位置一直存有元素称为满栈栈顶所在位置一直没有元素称为空栈增栈、减栈根据栈的生长方向确定入栈数据时栈顶向内存高地址移动称为增栈入栈数据时栈顶向内存低地址移动称为减栈组合满增栈、空增栈、满减栈、空减栈链式栈使用链式存储结构(链表结点)实现的栈入栈采用头插法出栈删除头结点不存在栈满问题。链式栈的 API创建栈入栈出栈判栈空获取栈顶元素清空栈(删除栈中的所有结点)销毁栈文件说明文件说明stack.h头文件栈结构体定义 函数声明stack.c源文件栈所有功能实现main.c测试 main 函数二、头文件 stack.h#ifndef _STACK_H #define _STACK_H #include stdio.h #include stdlib.h typedef int Data_t; /* 栈结点结构体:数据域 指针域 */ typedef struct node { Data_t data; // 数据域:保存的数据 struct node *pnext; // 指针域:下一个结点的地址 }Node_t; /* 栈对象结构体:栈顶指针 结点计数 */ typedef struct stack { Node_t *ptop; // 栈顶指针 int clen; // 栈当前结点个数 }Stack_t; extern Stack_t *create_stack(); extern int is_empty_stack(Stack_t *pstack); extern int en_stack(Stack_t *pstack,Data_t data); extern int de_stack(Stack_t *pstack,Data_t *data); extern int show_stack(Stack_t *pstack); extern int get_stack_top(Stack_t *pstack,Data_t *data); extern int free_stack_node(Stack_t *pstack); extern void free_stack(Stack_t *pstack); #endif三、功能实现 stack.ccreate_stack 创建栈功能分配栈管理结构体初始化栈顶指针 ptop 置 NULL、结点计数 clen 为 0。返回栈指针malloc 失败返回 NULL。Stack_t *create_stack() { Stack_t *pstack malloc(sizeof(Stack_t)); if(pstack NULL) { printf(malloc fail\n); return NULL; } pstack-clen 0; pstack-ptop NULL; return pstack; }is_empty_stack 判栈空功能判断栈是否为空。返回1 空0 非空-1 入参为 NULL。int is_empty_stack(Stack_t *pstack) { if(pstack NULL) { return -1; } else { return pstack-clen 0; } }en_stack 入栈(压栈)功能头插法在栈顶插入新结点新结点指针域指向原栈顶结点更新栈顶指针计数自增。返回0 成功-1 失败(入参为 NULL 或者 malloc 失败)。int en_stack(Stack_t *pstack,Data_t data) { if(pstack NULL) { return -1; } Node_t *ptemp malloc(sizeof(Node_t)); if(ptemp NULL) { printf(malloc fail\n); return -1; } ptemp-data data; ptemp-pnext pstack-ptop; pstack-ptop ptemp; pstack-clen; return 0; }de_stack 出栈(弹栈)功能删除栈顶结点并带回其数据栈顶指针后移一位释放原栈顶结点计数减一。返回0 成功-1 失败(栈空或入参为 NULL)。int de_stack(Stack_t *pstack,Data_t *data) { if(is_empty_stack(pstack) ! 0) { return -1; } Node_t *ptemp pstack-ptop; *data ptemp-data; pstack-ptop ptemp-pnext; free(ptemp); return 0; }get_stack_top 获取栈顶元素功能读取栈顶结点的 data 数据不删除结点。返回0 成功-1 失败(栈空或入参为 NULL)。int get_stack_top(Stack_t *pstack,Data_t *data) { if(is_empty_stack(pstack) ! 0) { return -1; } *data pstack-ptop-data; return 0; }show_stack 遍历打印栈功能从栈顶开始循环遍历打印栈中所有 data 数据。返回0 成功-1 失败(栈空或入参为 NULL)。int show_stack(Stack_t *pstack) { if(pstack NULL) { return -1; } Node_t *ptemp pstack-ptop; if(pstack-clen ! 0) { while(ptemp ! NULL) { printf(%d ,ptemp-data); ptemp ptemp-pnext; } printf(\n); return 0; } return -1; }free_stack_node 清空栈功能循环释放栈中所有数据结点清空后栈顶指针置 NULL、计数置 0。返回0 成功-1 入参为 NULL。int free_stack_node(Stack_t *pstack) { if(pstack NULL) return -1; Node_t *ptemp pstack-ptop; if(pstack-clen ! 0) { while(ptemp! NULL) { pstack-ptop ptemp-pnext; free(ptemp); ptemp pstack-ptop; } pstack-ptop NULL; pstack-clen 0; } return 0; }free_stack 销毁栈功能先调用 free_stack_node 释放全部数据结点最后释放栈管理结构体。void free_stack(Stack_t *pstack) { free_stack_node(pstack); free(pstack); }四、测试 main 函数 main.c#include stack.h int main(void) { Data_t data; Stack_t *pstack create_stack(); en_stack(pstack,1); en_stack(pstack,2); en_stack(pstack,3); en_stack(pstack,4); en_stack(pstack,5); show_stack(pstack); printf(---------\n); de_stack(pstack,data); printf(%d\n,data); printf(---------\n); get_stack_top(pstack,data); printf(top_stack %d\n,data); printf(---------\n); free_stack(pstack); return 0; }五、编译运行 内存检测编译gcc main.c stack.c -o stack_demo运行程序./stack_demovalgrind 检测内存泄漏写栈务必检测内存泄漏保证每一块 malloc 都有对应的 freevalgrind --leak-checkfull ./stack_demo运行输出结果5 4 3 2 1 5 top_stack 4

相关新闻

手机版deepseek里复制代码怎么用?AI导出鸭一键无损导出格式不崩

手机版deepseek里复制代码怎么用?AI导出鸭一键无损导出格式不崩

手机版DeepSeek生成代码后直接复制粘贴到本地编辑器,缩进全乱、换行符丢失、特殊字符变问号——这是移动端开发者和学习者的高频痛点。根源在于手机浏览器剪贴板对富文本和纯文本的转换逻辑不统一,复制时丢失了代码的缩进层级、空行和语法高亮元信息。AI…

2026/11/13 5:25:09 阅读更多 →
玉柴 1800kW(PRP 主用功率)10.5kV 高压柴油发电机组核心特性

玉柴 1800kW(PRP 主用功率)10.5kV 高压柴油发电机组核心特性

基准配置:发动机 YC12VC2700L-D31 / YC16VC3000-D31;1800kW PRP/2250kVA,10.5kV 高压同步发电机,50Hz/1500rpm 一、动力本体(发动机)核心特性1. 结构硬件特点V 型 12 缸 / 16 缸四冲程、水冷、增压中冷、电…

2026/11/13 16:15:02 阅读更多 →
下界理论:差分隐私能有多好?

下界理论:差分隐私能有多好?

原文课程: Lecture 11 — Packing Lower Bounds (Gautam Kamath, CS 860, Fall 2020) 上几讲我们看到了各种 DP 算法,自然会问一个问题:我们能不能做得更好? 或者说,现在已经有的算法是否已经是最优的了? 答案是&…

2026/11/1 7:09:38 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻