什么是栈?

ps:文章来自于网络

当提及“栈”这个概念,很多初学者都会很迷茫。在C语言里,我们有一个内存区域叫做栈区。在单片机里,我们又常常听到一个操作叫做压栈。而在算法中,我们也有一个同名结构叫做栈。

我常常会问自己的学生“栈”这个字的意思到底是什么?大家想到的多是客栈。我们翻翻字典也不难发现,栈的第一个释义是:储存货物或供旅客住宿的房屋。所以客栈的想法并没有错,但是这也未免太过抽象。

我们先来解释一下在计算机领域什么是栈。

栈某种意义上讲,它像是一个开口的盒子,先放进去的东西总是会被后放进去的东西压在下面,那么如果想拿出被压住的东西,必须要先取出顶部的东西,也就是后放进去的东西。换个说法就是先入后出。那它有点像什么呢?想象一下装在盘子里的若干张油饼。

对,他们是摞在一起的。如果想拿下面的油饼是不是要先拿开上面的呢?或许,这就是栈的根源。但是,又和“栈”这个字有什么关系呢?单纯的从释义上看,好似找不出什么关联性。但是当我们打开汉英词典:

对计算机中提及的“栈”的英文愿意是stack!我们一定要记得,是一群说英语的人创造了计算机,也是他们研究了初的算法。那么stack又是什么意思?

注意箭头指向的那一摞书们,和饼们的相处方式是不是很像!堆叠到一起。那个根源出来了,其实栈就是一种将数据依次“堆叠”的一种数据组织方式。

或者到这里,我们恍然大悟,哦,原来是这样!栈还有堆叠的意思。但是,我个人更觉得这是一种初期程序员之间的交流翻译吴缪。暂且放下这个不谈,至少我们明白一件事情,在某些领域,如果一个词汇很生涩,那么,不妨去查找一下他的英文愿意,或许你会有更深入的收获。

我们在来探讨下一个话题——“栈”stack,这种摞大饼大数据组织方式到底有什么用?

比如说,你有一些书,我们通常会这样摆放:

而不是这样:

为什么呢?当然是第二种摆放方式不方便拿其中的某一本书。可是在“栈”(stack)结构里面,“书”就是这样摆放的。那也就是说,“栈”(stack)不适合存放需要随机查找的东西。那它能做什么呢?

首先说说CPU里的“堆栈”。我们可以这样设想:一个CPU等同于一个完全没有记忆力的人,他只知道按照一份很详细的说明文档(也就是程序)来一步一步做某件事情,并且,他永远不会记得之前做过什么。我们在电影里常常会看到这样的情节,失忆症的人常常会随身携带一些本子和照片,然后按顺序把发生的事情记录下来,方便自己查阅。CPU也有这样的需求。

在CPU里,有一种机制叫做“中断”interrupt,就是中途插一嘴的意思。怎么插呢?比方说,你正在玩儿一个单机游戏,在更要通关的时候,外面突然有人敲门。那么是不是要把你的游戏暂停一下?然后再去开门。然后正在你去开门的路上,厨房的煤气报警器响起,是不是要赶紧去厨房看一下是不是误报警?确认是误报警后,我们是先去开门呢?还是继续打游戏呢?对于CPU来说,也会有同样的困惑。对于人,我们或许可以思考一下——哦,开门这件事器比较紧迫,应该先开门。但是对于CPU来说,又如何区分紧迫度呢?这就变成了一个很麻烦的问题。我们回头再想想“栈”,他是如何组织数据的?先入后出。玩游戏是先发生的事情,那么打断他的事情就是更紧迫的事情,开门虽然比游戏紧迫,但是他次于煤气报警,所以,它才是紧迫的事情。不过到现在也应该注意到了。紧迫的事情往往在后产生,又要被优先处理。

在CPU的中断机制里,每当cpu执行的一个任务被打断时,cpu就需要备份当前的处理状态,就像没有记忆的人,总是要记笔记拍照。那么cpu怎么区分优先次序呢?就像你吃盘子里的饼!先拿上面的。而存储数据的过程,就像你向盘子里放饼的过程。

再说说C语言分段里的“栈区”,我们都知道,局部自动变量分配到内存的“栈区”,栈区里的数据组织方式也类似摞饼,每当你调用了一个子函数,那么编译器会将子函数里的局部变量分配到栈区的栈顶位置(与当前函数的空间相邻),当子函数在再调用另一个函数是,也是会做同样处理。儿关于局部变量的释放,其实本质就是讲栈顶的一块空间的使用权归还回去,看起来就好像客栈一样,来人的时候开房,走人的时候退房。或许这也是stack会被翻译成“栈”的原由。

后在来说“栈”,这种单纯的逻辑结构。它和前两者一样,遵循类似先入后出的数据处理规则。

那这个“盒子“什么时候会用到呢?典型的例子,就是迷宫算法(具体细节可以自己搜索一下),我们可以用栈来存放已经走过的有效路线。也或者利用栈来模拟局部变量分配,实现将递归算法转换为非递归。也或者利用栈来优化,自己的程序处理逻辑,在实际问题解决中,如果你涉及到了临时保存数据,那么你可以尝试考虑一下使用栈,或许可以让自己的程序在逻辑上变得更加清晰明了。

简单的总结一下:所谓“栈”,其实就是一本 相互堆叠的便签儿。我们可以逐次备份自己要保存的信息,然后在反向依次处理。

计算机基础_001_栈是什么相关推荐

  1. 「计算机基础」栈结构

    Stack Layout 说到栈,就必须要提及function函数,所以我们可以从一个函数中来看. 栈结构 void func(int a,int b) {int x,y;x = a+b;y = a- ...

  2. 计算机堆和栈的基本知识,计算机基础知识

    # 12. 计算机基础 ### 操作系统的发展历史 ![](https://box.kancloud.cn/81dff3d119ab81119630ae30ccacd081_714x760.png) ...

  3. 关于计算机网络传输介质 下列叙述正确的是,《计算机基础》习题1-7

    4. 算法的基本结构中包括( ) A.顺序结构 B.选择结构 C.循环结构 D.逻辑结构 5.关于Excel图表的数据源,下列叙述不正确的是( ) A. 可以修改图表的数据源 B. 图表的数据源必须是 ...

  4. 计算机及网络应用基础思维导图_计算机基础/算法/面试题 PDF+思维导图下载

    之前为了面试,整理了九大应付面试的思维导图 + 一份 630 页的程序员内功修炼手册 + 一份计算机基础/算法/Java技术栈/Linux C++技术栈的资料.当时我就是靠着这份思维导图以及整理的 P ...

  5. 计算机基础扎实,到底是说什么?

    hi, 大家好,今天和大家一起聊聊,计算机基础, 不管校招或社招面试,还是工作普升,还是技术成长,都要求需要扎实的计算机基础,职级(薪资)越高对基本功的要求就会越高,很多人可能不清楚,到底什么是扎实的 ...

  6. 计算机基础- -应用和硬件的关系

    计算机基础- -应用和硬件的关系 文章目录 计算机基础- -应用和硬件的关系 一.应用和硬件的关系 1.支持硬件输入输出的IN指令和OUT指令 2.测试输入和输出程序 3.外围设备的中断请求 4.用中 ...

  7. 计算机基础- -认识汇编

    计算机基础- -汇编语言 文章目录 计算机基础- -汇编语言 一.汇编语言和本地代码 二.通过编译器输出汇编语言的源代码 三.不会转换成本地代码的伪指令 四.汇编语言的语法是操作码+操作数 1.指令解 ...

  8. 计算机基础- -认识磁盘

    计算机基础- -认识磁盘 文章目录 计算机基础- -认识磁盘 一.认识磁盘 程序不读入内存就无法运行 二.磁盘构件 1.磁盘缓存 2.虚拟内存 虚拟内存与内存的交换方式 三.节约内存 1.通过DLL文 ...

  9. 信息学竞赛计算机基础知识,信息学奥赛-计算机基础知识.doc

    信息学奥赛-计算机基础知识 TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc303947525" 第一章 计算机基础知识 PAG ...

最新文章

  1. java map prefix_从键以特定表达式开头的Map中获取所有值的最快方法
  2. redis学习(二)
  3. 网络编程(part1)--IO及字节串
  4. easyui数据表格重置_数据库三种删除方式
  5. 关于oracle数据库论文,Oracle数据库研究论文 有关Oracle数据库的论文
  6. PTA-1021—— Deepest Root(最后两组数据错误)
  7. .NET Core通讯模块在Linux下的性能测试
  8. E20170603-ts
  9. 小程序“成语猜题”部分答案,总共28667题
  10. Mandriva本地安装
  11. X1000 SPI 时钟获取失败
  12. 解决爱快+openwrt双软路由,爱快设备列表中mac地址全部为openwrt的mac的问题
  13. Flask Request对象
  14. 金融小知识 | Fama-Macbeth回归
  15. python软件工程师月薪-软件工程师薪水知多少?
  16. 服务器显示屏 超出工作频率范围,win7显示器超出工作频率范围怎么解决
  17. NGINX 的域名解析缓存
  18. HDU 5643 King's Game 【约瑟夫环】
  19. Mac电脑如何启用root用户
  20. 超9成SCI论文发在国外!中文期刊到底差在哪?

热门文章

  1. 如何用 CSS 实现三角形
  2. vuex4 极速入门到上手
  3. 【LeetCode 876】链表的中间结点
  4. weblogic 忘记密码重置密码
  5. 那个学php的上吊了,这位一路名校的中国博士,突然在美国上吊自杀了
  6. Leetcode-545. Boundary of Binary Tree
  7. windows下wav格式歌曲文件信息修改
  8. 基于FPGA的实时视频信号处理方案
  9. receptive field,即感受野
  10. 【正点原子I.MX6U-MINI】修改开机内核Logo和进度条界面Logo(一)