数据结构——6.链式栈

发布时间:2026/10/11 1:32:28

数据结构——6.链式栈 一、前言栈是后进先出的特殊线性表主流分为顺序栈和链式栈。这一篇讲述的是链式栈。顺序表尾部增删无需移动元素时间复杂度是O1因此顺序栈以数组尾部作为栈顶依靠尾插、尾删完成入栈、出栈。反观单链表访问尾部需要遍历整条链表效率低下而链表头部插入、删除仅修改头指针时间复杂度同样为O(1)。基于该特性链式栈将链表头部作为栈顶通过头插实现Push入栈头删实现Pop出栈全部基础操作均为常数时间复杂度。二、代码实现typedef int ELEMTYPE; //链式栈的有效定义节点 typedef struct LSNode { ELEMTYPE data;//数据域存放栈中存储的元素 struct LSNode* next;//指针域指向栈中下一个节点 }LSNode; //链式栈的辅助节点直接借用有效节点的结构体设计不再单独设计 //1.初始化 void Init_LinkStack(LSNode* pls); //2.入栈 bool Push(LSNode* pls, ELEMTYPE val); //3.出栈 bool Pop(LSNode* pls); //4.获取栈顶元素值 ELEMTYPE Top(LSNode* pls); //5.判空 bool Empty(LSNode* pls); //6.打印 void Show(LSNode* pls); //7.销毁 void Destroy(LSNode* pls);函数1初始化void Init_LinkStack(LSNode* pls) { assert(pls!NULL); pls-nextNULL;//栈为空 }LSNode;2入栈相当于单链表头删bool Push(LSNode* pls, ELEMTYPE val) { //0 assert(pls ! NULL); //1.购买新节点 LSNode* pnewnode (LSNode*)malloc(1 * sizeof(LSNode)); if (NULL pnewnode) exit(EXIT_FAILURE); pnewnode-data val; pnewnode-next NULL; //2.找到合适的插入位置找到插在哪个节点的后面头插比较特殊肯定是插入辅助节点后面 LSNode* p pls; //3.进行插入修改两个指针域 pnewnode-next p-next; p-next pnewnode; return true; }3出栈相当于单链表头删bool Pop(LSNode* pls) { //0 assert(pls ! NULL); //1.判空 if (IsEmpty(pls)) return false; //2.找到待删除节点用指针q指向头删比较特殊q指向第一个节点 LSNode* q pls-next; //3.再找到待删除节点的上家用指针p指向 LSNode* p pls; //4.pq就位跨越指向释放 p-next q-next; free(q); q NULL; return true; }4获取栈顶元素ELEMTYPE Top(LSNode* pls) { assert(pls ! NULL); if (IsEmpty(pls)) return false; return pls-next-data; }5判空bool IsEmpty(LSNode* pls) { //0 assert(pls ! NULL); return pls-next NULL; }6打印bool IsEmpty(LSNode* pls) { //0 assert(pls ! NULL); return pls-next NULL; }7销毁void Destroy(LSNode* pls) { //1. while (!IsEmpty(pls)) { Pop(pls); } // /*LSNode* p pls; LSNode* q pls-next; p-next q-next; free(q); q NULL;*/ }mainint main() { LSNode head; Init_LinkStack(head); Push(head, 12); Push(head, 23); Push(head, 34); Show(head); Pop(head); Show(head); printf(TOP%d\n, Top(head)); Show(head); return 0; }
延伸阅读

更多相关文章

2026/10/11 1:32:28

GitHub f/prompts.chat:原名 Awesome ChatGPT Prompt...

GitHub f/prompts.chat:原名 Awesome ChatGPT Prompts 的真实价值与自托管部署实践开场断言绝大多数企业级大模型应用场景中,80%的ROI来自于5%的定制化Prompt,而开源社区却鲜少有人系统化利用Prompt库。直接调用大模型API的方案看似高效&…

2026/10/11 1:32:28

护理实训多工位怎么同屏对比:调度系统的分屏布局怎么用

护理实训多工位怎么同屏对比:调度系统的分屏布局怎么用 本文发布于 2026 年 10 月 8 日|最后更新 2026 年 10 月 8 日 场景:多工位分组实训|适用专业:职业院校实训室、产教融合基地、企业内训 结论先行 多工位分组实训…

2026/10/11 2:32:30

JVM垃圾回收面试题全解析:从对象判活到三色标记与收集器选型

JVM垃圾回收面试题,几乎可以说是Java面试的“必考大题”。无论校招还是社招,面试官基本都会从内存模型切入,一路追问到垃圾回收的算法、收集器、调优参数。很多候选人基础题背得滚瓜烂熟,一到“为什么这样设计”“两者对比怎么选”…

2026/10/11 2:32:30

Niagara轻量发射器优化实战:从粒子模块减法到渲染性能提升

Niagara的Lightweight Emitters,这件事我最初是从一次移动端掉帧事故开始的。当时接到一个模拟项目X的优化任务,场景里有一批体积烟雾、火花和扬尘效果,总共十几个Niagara发射器,在某中端手机上帧耗时直接飙到11ms以上&#xff0c…

2026/10/11 2:32:30

AnyPS5串流实战:跨平台游戏串流原理、配置与延迟优化指南

1. 从“AnyPS5”这个标题说起:一个跨平台串流工具的设计思路第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率又是一个围绕主机游戏串流做文章的项目。果不其然,稍微琢磨一下就能明白,它想解决的核…

2026/10/11 2:27:30

ONNX Runtime 模型部署全链路实战:从导出到量化与跨平台优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑