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

相关推荐
晓蛋1 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿1 天前
重载、重写(覆盖)、重定义区别
c语言
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
phltxy1 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
m0_547486661 天前
《数据结构教程》全套 PPT课件2026
数据结构
phltxy1 天前
C 语言中的数据存储:从类型到二进制位
c语言
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控