什么是栈?

同顺序表和链表一样,栈也是用来存储逻辑关系为 “一对一” 数据的线性存储结构,如下图所示。

从上图我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 “存” 和 “取” 的过程有特殊的要求:

  1. 栈只能从表的一端存取数据,另一端是封闭的,如上图所示;
  2. 在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿上图的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。

因此,我们可以给栈下一个定义,即栈是一种只能从表的一端存取数据且遵循 “先进后出” 原则的线性存储结构。

通常,栈的开口端被称为栈顶;相应地,封口端被称为栈底。因此,栈顶元素指的就是距离栈顶最近的元素,拿下图来说,栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,下图中的栈底元素为元素。

进栈和出栈

基于栈结构的特点,在实际应用中,通常只会对栈执行以下两种操作:

  • 向栈中添加元素,此过程被称为"进栈"(入栈或压栈);
  • 从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);

栈的具体实现

栈是一种 “特殊” 的线性存储结构,因此栈的具体实现有以下两种方式:

  1. 顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构;
  2. 链栈:采用链式存储结构实现栈结构;

两种实现方式的区别,仅限于数据元素在实际物理空间上存放的相对位置,顺序栈底层采用的是数组,链栈底层采用的是链表。有关顺序栈和链栈的具体实现会在后续章节中作详细讲解。

顺序栈基本操作

顺序栈,即用顺序表实现栈存储结构。通过前面介绍我们知道,使用栈存储结构操作数据元素必须遵守 “先进后出” 的原则,下面就 “如何使用顺序表模拟栈以及实现对栈中数据的基本操作(出栈和入栈)” 给大家做一些介绍。

如果你仔细观察顺序表(底层实现是数组)和栈结构就会发现,它们存储数据的方式高度相似,只不过栈对数据的存取过程有特殊的限制,而顺序表没有。

例如,我们先使用顺序表(a 数组)存储{1,2,3,4},存储状态如下图所示:


同样,使用栈存储结构存储{1,2,3,4},其存储状态如下图所示:

通过上面两张图对比不难看出,使用顺序表模拟栈结构很简单,只需要将数据从 a 数组下标为 0 的位置依次存储即可。

从数组下标为 0 的模拟栈存储数据是常用的方法,从其他数组下标处存储数据也完全可以,这里只是为了方便初学者理解。

了解了顺序表模拟栈存储数据后,接下来看如何模拟栈中元素出栈的操作。由于栈对存储元素出栈的次序有"先进后出"的要求,如果想将图中存储的元素 1 从栈中取出,需先将元素 4、元素 3 和元素 2 依次从栈中取出。

这里给出使用顺序表模拟栈存储结构常用的实现思路,即在顺序表中设定一个实时指向栈顶元素的变量(一般命名为 top),top 初始值为 -1,表示栈中没有存储任何数据元素,及栈是"空栈"。一旦有数据元素进栈,则 top 就做 +1 操作;反之,如果数据元素出栈,top 就做 -1 操作。

顺序栈元素"入栈"

比如,还是模拟栈存储{1,2,3,4} 的过程。最初,栈是"空栈",即数组是空的,top 值为初始值 -1,如下图所示:

首先向栈中添加元素 1,我们默认数组下标为 0 一端表示栈底,因此,元素 1 被存储在数组 a[1] 处,同时 top 值 +1,如下图所示:

采用以上的方式,依次存储元素 2、3 和 4,最终,top 值变为 3,如下图所示:

因此,C 语言实现代码为:

//元素elem进栈,a为数组,top值为当前栈的栈顶位置
int push(int* a,int top,int elem){a[++top]=elem;return top;
}

代码中的 a[++top]=elem,等价于先执行 ++top,再执行 a[top]=elem。

顺序栈元素"出栈"

其实,top 变量的设置对模拟数据的 “入栈” 操作没有实际的帮助,它是为实现数据的 “出栈” 操作做准备的。

比如,将上图中的元素 2 出栈,则需要先将元素 4 和元素 3 依次出栈。需要注意的是,当有数据出栈时,要将 top 做 -1 操作。因此,元素 4 和元素 3 出栈的过程分别如下图a) 和 下图b) 所示:

注意,上图数组中元素的消失仅是为了方便初学者学习,其实,这里只需要对 top 值做 -1 操作即可,因为 top 值本身就表示栈的栈顶位置,因此 top-1 就等同于栈顶元素出栈。并且后期向栈中添加元素时,新元素会存储在类似元素 4 这样的旧元素位置上,将旧元素覆盖。

元素 4 和元素 3 全部出栈后,元素 2 才能出栈。因此,使用顺序表模拟数据出栈操作的 C 语言实现代码为:

//数据元素出栈
int pop(int * a,int top){if (top==-1) {printf("空栈");return -1;}printf("弹栈元素:%d\n",a[top]);top--;return top;
}

代码中的 if 语句是为了防止用户做 “栈中已无数据却还要数据出栈” 的错误操作。代码中,关于对栈中元素出栈操作的实现,只需要 top 值 -1 即可。

以上就是本次给大家分享的利用C语言简单的实现顺序栈以及向大家介绍了栈的特点,完整的代码已经上传到github,C语言实现顺序栈 欢迎大家Star ! 想要了解其他相关数据结构算法实现的小伙伴也可以来我的博客MyBlog,我们一起交流,一起进步啊!

C语言实现顺序栈以及栈的特点相关推荐

  1. c语言栈的实现以及操作_C++语言实现顺序栈

    在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以看看之前的文章,下面是链接C语言实现顺序栈在这 ...

  2. c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?

    看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...

  3. 停车场管理系统(C语言顺序栈+链栈+链队列)

    一.实验目的 1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈.队列进行分析: 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用 ...

  4. 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法

    试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...

  5. c语言堆栈基本代码入栈出栈_顺序栈基本操作(入栈和出栈)C语言详解

    顺序,即用{1,2,3,4},存储状态如 图 1 顺序表存储 {1,2,3,4} 同样,使用栈存储结构存储 {1,2,3,4},其存储状态如图 2 所示: 图 2 栈结构存储 {1,2,3,4} 通过 ...

  6. C语言实现顺序栈心得

    栈的构成及初始化 对于"先进后出"的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态 ...

  7. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

  8. 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)

    1 #include 2 #include 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 10//存储空间分配增量 ...

  9. C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)

    //顺序栈的基本操作 #include<stdio.h> #define MaxSize 50 typedef int ElemType; //定义栈结构体 typedef struct ...

  10. C语言 数据结构 顺序栈的实现 进栈 出栈 初始化

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.代码实现 前言 顺序栈是栈的顺序实现.顺序栈是指利用顺序存储结构实现的栈.采用地址连续的存储空间(数组)依次存储栈 ...

最新文章

  1. eslint 学习笔记
  2. 020-请你说一说app测试的工具
  3. 草莓甜品海报设计,甜出画面,受得住诱惑么?
  4. pytorch torch.nn.TransformerEncoder
  5. perl中shift 和unshift 操作
  6. python基本代码教程-python基础教程第三版源代码
  7. Linux C语言解析并显示.bmp格式图片
  8. bzoj2339: [HNOI2011]卡农
  9. 单片机c语言程序设计实训100例基于pic pdf,单片机C语言程序设计实训100例 基于AVR+Proteus仿真.pdf...
  10. WIN10安装SQL SERVER 2005 服务无法启动
  11. 传智播客杨中科老师的全13季 C#、Asp.net视频教程
  12. 联想小新打印机M7268W固件升级步骤
  13. Java实验一:博饼
  14. 余弦 matlab 幅度谱,数字图像处理_旋转与幅度谱(含MATLAB代码)
  15. 游戏推广中CPA,CPT和CPS是什么意思?
  16. wap建站程序源码_织梦程序搭建网站实例教程,想尝试搭建网站的朋友赶紧保存了...
  17. 将DLL注册到GAC
  18. 不久的明天,也许是很光明的
  19. 一条Fofa搜索语法,实现批量挖洞
  20. arma找不到合适的模型_ARMA模型建模与预测指导

热门文章

  1. python基础练习题:找到一个圆锥的体积。【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  2. 心理学与生活 - 情绪与情感
  3. Python自动锁屏--window系统
  4. 文件压缩原理是什么?
  5. 【Excel VBA】自动调整列宽和行高
  6. vue.js基础 之 过滤器分类及使用
  7. 【PS功能学习】10:蒙版带你领略台前幕后的故事
  8. 识别中文_文字的效率:中英韩日四国文字识别效率对比,中文遥遥领先
  9. POJ3345 Bribing FIPA(树形DP)
  10. .nav ul .mall a:hover是什么意思