从零开始的敲代码生活--数据结构篇(栈)

发布时间:2026/8/26 17:36:38

从零开始的敲代码生活--数据结构篇(栈)
一、栈基础概念栈结构只允许从一端进行插入和删除数据的线性存储结构称为栈结构。 数据插入和删除的这端称为栈顶另一端称为栈底。 数据的插入称为入栈/压栈数据的删除称为出栈/弹栈。特点 先进后出(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

相关新闻

销售线索数据对接电销系统:字段映射与批量导入实践

销售线索数据对接电销系统:字段映射与批量导入实践

2026/8/26 17:36:38

从数据字段映射的角度,说说拓客工具和电销系统之间的对接流程。拓客工具导出的名单,格式一般是什么样的?大部分拓客工具导出的名单是Excel或者CSV格式,常见字段包括企业名称、联系电话、所在地区、行业分类、成立时间、注册资本这…

Go-Channel底层结构深度解析与select多路复用机制

Go-Channel底层结构深度解析与select多路复用机制

2026/8/26 17:36:38

Go Channel底层结构深度解析与select多路复用机制 文章导语 Channel是Go并发编程的灵魂——“不要通过共享内存来通信,而要通过通信来共享内存”。但Channel的底层实现远比表面复杂:环形缓冲区、等待队列、goroutine的阻塞/唤醒、select的随机性……本文…

Go-Goroutine泄漏检测与预防从pprof到生产监控

Go-Goroutine泄漏检测与预防从pprof到生产监控

2026/8/26 17:36:38

Go Goroutine泄漏检测与预防从pprof到生产监控 文章导语 Goroutine泄漏是Go应用中最隐蔽的性能问题。一个泄漏的goroutine不仅消耗内存(每个约2-8KB),还会占用文件描述符、数据库连接等系统资源。随着时间推移,泄漏的goroutine会逐…

如何安装dsh deepseek harness

如何安装dsh deepseek harness

2026/8/26 18:36:41

目录 安装 nvm 安装dsh 使用npx deepseek-ai/dsh weba安装 使用git clone https://github.com/deepseek-ai/deepseek-harness.git 下载到本地安装 准备工作: 1:首先去存盘里找到文件夹 2:在输入框中打上cmd ​编辑 指令的输入 1&am…

postiz-mcp MCP 服务说明文档

postiz-mcp MCP 服务说明文档

2026/8/26 18:36:41

1. 服务概述一句话简介:Postiz官方MCP客户端,提供完整的Postiz公共API覆盖(集成、帖子、上传、分析、视频),支持环境变量控制写入权限、确认删除和内置速率限制保护服务名称:postiz-mcp版本号:1…

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

2026/8/26 18:36:41

结论先行:水域救援割绳刀是体积最小、却直接关系生死的应急装备,国内选型已有清晰的参数共识:刀刃硬度不低于48HRC(按GB/T 230.1洛氏硬度方法检测)、平头钝头防刺伤刀型加齿形割绳刃、湿手单手操作的防滑手柄、刀鞘牢固…

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

2026/8/26 18:36:41

位置信息是核心隐私数据。Android 15新增应用行为记录功能,让用户清晰查看所有应用访问位置信息的记录,精准识别频繁访问的应用。本文解析原理、查看步骤、优化技巧及故障排查。一、核心逻辑与风险应用通过调用系统位置API获取位置信息。Android 15收紧权…

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

2026/8/26 18:36:41

目录一、Action 对象已经有了,Flink 作业还没有运行二、run() 到底定义在哪个类里?三、创建 Action 时,执行环境已经准备好了为什么开启 Object Reuse?四、run() 实际只做三件事1. 没有配置 Checkpoint 时,默认开启三分…

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026/8/26 18:26:40

本文由 GO FUNNY 出品。专注 AI Agent 协作方法论与开源工具深度解读。你想搭一个 AI agent,打开 GitHub 搜「agent framework」,按 star 排序,点进第一名,照着 quickstart 敲完,跑通了一个 demo——觉得这事稳了。然后…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…