栈|数据结构|C语言|详细讲解|代码实现

介绍栈

内存可以分为"静态内存"和"动态内存",讲台内存是在栈中分配的,动态内存是在堆中分配的。

静态或局部变量,是以压栈和出栈的方式分配内存的,就叫栈区;

动态内存是一个一种堆排序的方式分配内存的,就叫堆区。

栈的分类

静态栈和动态栈是两种常用的数据结构,它们的主要区别在于存储方式。

  1. 静态栈:

静态栈通常使用数组来实现。它有一个固定的大小,即栈的最大容量。一旦栈满了,就无法再添加元素,除非重新分配更大的数组。静态栈的优点是操作速度快,因为数组的访问和更新都是直接进行的。但缺点是灵活性较差,因为栈的大小在创建时就已经确定,无法动态地增加或减少。

  1. 动态栈:

动态栈通常使用链表来实现。与静态栈不同,动态栈的大小是动态的,可以根据需要增长或缩小。当栈满时,可以通过添加新的节点来扩展其容量;当栈空时,可以释放一些节点以减小其容量。动态栈的优点是灵活性高,可以适应不同的需求,而不需要预先确定栈的大小。但缺点是操作速度较慢,因为链表的访问和更新需要遍历节点。

总结来说,静态栈和动态栈各有优缺点。静态栈操作速度快,但灵活性差;动态栈灵活性高,但操作速度慢。选择使用哪种数据结构取决于具体的应用场景和需求。

栈可以执行哪些操作

·出栈(弹栈)

·入栈(压栈)

栈程序演示

代码实现

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include****<**** stdio****.**** h****>**** #include****<**** malloc****.**** h****>**** #include****<**** stdlib****.**** h****>**** //定义链表节点的数据类型 typedef struct Node****{**** int data****;**** struct Node********* pNext****;**** } NODE****,***** PNODE****;**** //定义栈数据类型 typedef struct Stack****{**** PNODE top****;**** //指向栈顶元素 PNODE bottom****;**** //指向栈底元素的下一个位置 } stack****,***** pstack****;**** void init****(**** pstack s****);**** //初始化,创建空栈 void push****(**** pstack s****,**** int val****);**** //入栈 void traverse****(**** pstack s****);**** //出栈 int showTop****(**** pstack s****);**** //显示栈顶元素 int pop****(**** pstack s****);**** //出栈 bool isEmpty****(**** pstack s****);**** int main****(){**** stack S****;**** init****(&**** S****);**** push****(&**** S****,**** 1****);**** push****(&**** S****,-**** 9****);**** push****(&**** S****,**** 88****);**** traverse****(&**** S****);**** printf****(**** "栈顶元素为%d \n****"**** , showTop****(&**** S****));**** printf****(**** "出来一个栈顶元素:%d \n****"**** , pop****(&**** S****));**** printf****(**** "出来一个栈顶元素:%d \n****"**** , pop****(&**** S****));**** printf****(**** "出来一个栈顶元素:%d \n****"**** , pop****(&**** S****));**** //printf("出来一个栈顶元素:%d\n",pop(&S)); traverse****(&**** S****);**** return 0****;**** } //初始化栈 //创建一个空栈,空战就是栈的top和bottom指针都指向一个空的不存储任何数据的节点 void init****(**** pstack s****){**** s****->**** top****=(**** PNODE****)**** malloc****(**** sizeof ( NODE****));**** if (! s****->**** top****){**** printf****(**** "动态内存分配失败 \n****"**** ); exit****(-**** 1****);**** } else { s****->**** bottom****=**** s****->**** top****;**** s****->**** top****->**** pNext****=**** NULL****;**** //或s->bottom->pNext=NULL; } } void push****(**** pstack s****,**** int val****){**** PNODE pnew****=(**** PNODE****)**** malloc****(**** sizeof ( NODE****));**** pnew****->**** data****=**** val****;**** pnew****->**** pNext****=**** s****->**** top****;**** /*这一步不能是pnew->pNext=s->bottom,因为这一步是入栈而不是插入第一个元素。 bottom和top最开始都存着的空节点的地址,但只有top一直存着最顶端元素的地址*/ s****->**** top****=**** pnew****;**** } void traverse****(**** pstack s****){**** if ( isEmpty****(**** s****)){**** printf****(**** "栈已空,无法遍历" ); exit****(-**** 1****);**** } PNODE p****=**** s****->**** top****;**** while ( p****!=**** s****->**** bottom****){**** printf****(**** "%d " , p****->**** data****);**** p****=**** p****->**** pNext****;**** } printf****(**** " \n****"**** ); } int showTop****(**** pstack s****){**** return s****->**** top****->**** data****;**** } bool isEmpty****(**** pstack s****){**** if ( s****->**** top****==**** s****->**** bottom****){**** return 1****;**** } return 0****;**** } int pop****(**** pstack s****){**** if ( isEmpty****(**** s****)){**** printf****(**** "栈已空,无法出栈" ); exit****(-**** 1****);**** } int val****=**** s****->**** top****->**** data****;**** PNODE p****=**** s****->**** top****;**** s****->**** top****=**** s****->**** top****->**** pNext****;**** free****(**** p****);**** return val****;**** } |

相关推荐
CoovallyAIHub4 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub5 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub5 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub6 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub6 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞6 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想
徐小夕7 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub8 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
zone77399 小时前
002:RAG 入门-LangChain 读取文本
后端·算法·面试