顺序,即用{1,2,3,4},存储状态如

图 1 顺序表存储 {1,2,3,4}

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

图 2 栈结构存储 {1,2,3,4}

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

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

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

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

顺序栈元素"入栈"

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

图 3 空栈示意图

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

图 4 模拟栈存储元素 1

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

图 5 模拟栈存储{1,2,3,4}

因此,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 变量的设置对模拟数据的 "入栈" 操作没有实际的帮助,它是为实现数据的 "出栈" 操作做准备的。

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

图 6 数据元素出栈

注意,图 6 数组中元素的消失仅是为了方便初学者学习,其实,这里只需要对 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 语言完整代码:

#include

//元素elem进栈

int push(int* a,int top,int elem){

a[++top]=elem;

return top;

}

//数据元素出栈

int pop(int * a,int top){

if (top==-1) {

printf("空栈");

return -1;

}

printf("弹栈元素:%d\n",a[top]);

top--;

return top;

}

int main() {

int a[100];

int top=-1;

top=push(a, top, 1);

top=push(a, top, 2);

top=push(a, top, 3);

top=push(a, top, 4);

top=pop(a, top);

top=pop(a, top);

top=pop(a, top);

top=pop(a, top);

top=pop(a, top);

return 0;

}

程序输出结果为:

弹栈元素:4

弹栈元素:3

弹栈元素:2

弹栈元素:1

空栈

c语言堆栈基本代码入栈出栈_顺序栈基本操作(入栈和出栈)C语言详解相关推荐

  1. c语言堆栈基本代码入栈出栈_几道和「堆栈、队列」有关的面试算法题

    题目一:有效的括号 问题描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 解题思路 这道题让我们验证输入的字符串是否为括号字符串,包括大括号,中括号 ...

  2. c语言堆栈基本代码入栈出栈_C语言实现常用数据结构:栈-顺序栈实现(第6篇)...

    栈 栈是一种特殊的线性表,其特性是仅能在表尾进行插入或删除的操作,栈中元素的操作是按照后进先出的原则进行,因此栈又称为后进先出线性表(Last In First Out,LIFO数据结构).栈顶:表尾 ...

  3. java语言数组实现栈的操作_基于自定义的动态数组实现一个栈(Java语言)

    1.什么是栈? (1)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶. (2)栈是一种后进先出的数据结构 画个图: 2.栈的实现 (1)定义一个栈的接口 接口是类的行为的抽象. 以下行为分别 ...

  4. java栈 类 堆_详细介绍Java中的堆和栈

    栈与堆都是Java用来在RAM中寄存数据的中央.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运转时数据区,类的对象从中分配空间.这些对象经过new.newar ...

  5. java 栈的变量_深入Java核心:JVM中的栈和局部变量

    操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组.但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的.可把操作数栈理解为存储计算时,临时数据的存储区域.下面我们通过 ...

  6. python全栈开发下载_网易云课堂Python Flask框架全栈开发,全套视频教程学习资料通过百度云网盘下载...

    适用人群 1.想使用Python快速开发网站的. 2.前端开发者,想学习后端开发逻辑的. 3.有编程经验,想学习Flask的. 课程概述 本套课程的目标是从零基础开始,使用Flask框架开发企业级的项 ...

  7. 【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)

    目录 引言: 1. 关于变量 1.1 什么是变量 1.2 变量的定义与声明 1.3 为什么要定义变量 1.4 变量定义的本质 2. 关键字 2.1 最宽宏大量的关键字 - auto 2.1.1 局部变 ...

  8. c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...

    数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...

  9. 北航数据结构与c语言2017答案,2022年北京航空航天大学991数据结构与C语言程序设计考研资料汇总:参考书目-历年考研真题-模拟题库-笔记和课后习题详解...

    北京航空航天大学软件学院官网网址: 991数据结构与C语言程序设计考研参考书目: 谭浩强<C程序设计>(第4版)笔记和课后习题详解 谭浩强<C程序设计>(第4版)精讲班[教材精 ...

最新文章

  1. Windows下dump文件生成与分析
  2. (DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法
  3. 飞机票应该如何选择更安全
  4. java类什么时候卸载_java – Android:什么时候类被系统卸载?
  5. 根可达算法的根_我的JVM(六):GC的基础概念以及GC算法
  6. 特征缩放的效果:从词袋到 TF-IDF
  7. window7 64位 myeclipse9.0破解步骤
  8. linux 环境下安装 docker 精简步骤
  9. Linux USB网卡驱动安装
  10. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)
  11. C语言多文件编程详解
  12. matlab绘制空间摆线轨迹
  13. 程序员如何进行用户界面设计
  14. python证件照_python实现证件照换底功能
  15. Adobe认证证书(ACCD/ACPE)说明
  16. 图片嵌在文字里首行缩进
  17. Deer计划(2)cloudcompare解析--八叉树
  18. PHP生成海报 文字描边,海报字体 怎么为海报字体添加描边样式?海报文字描边怎么做?海报字体描边样式制作...
  19. java中分布式锁的实现方式
  20. 大家好,我是小组成员刘俊伟

热门文章

  1. mysql连接与嵌套查询_数据库的连接查询和嵌套查询怎么做啊?
  2. 在C++程序中添加逻辑流程控制
  3. 阿里云身份证实名认证
  4. vue3的自定义指令 v-focus写法
  5. Microapp 接入vite子应用
  6. python爬取搜狐新闻网站所有新闻的标题和正文并按阅读量排行输出
  7. exit在mysql中的意思_数据库exit是什么意思技术分享
  8. 针对家庭用户的6个物联网提示
  9. 千峰实训-Python-周六
  10. smtplib python教程_Python smtplib 教程