栈|数据结构|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****;**** } |

相关推荐
强哥聊算力5 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Navigator_Z9 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy9 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
himobrinehacken9 小时前
取模运算的汇编奥秘揭秘
c语言·安全
mmmmath_310 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
YangYang9YangYan11 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl211 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风11 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技11 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法