计算机基础_001_栈是什么
什么是栈?
ps:文章来自于网络
当提及“栈”这个概念,很多初学者都会很迷茫。在C语言里,我们有一个内存区域叫做栈区。在单片机里,我们又常常听到一个操作叫做压栈。而在算法中,我们也有一个同名结构叫做栈。
我常常会问自己的学生“栈”这个字的意思到底是什么?大家想到的多是客栈。我们翻翻字典也不难发现,栈的第一个释义是:储存货物或供旅客住宿的房屋。所以客栈的想法并没有错,但是这也未免太过抽象。
我们先来解释一下在计算机领域什么是栈。
栈某种意义上讲,它像是一个开口的盒子,先放进去的东西总是会被后放进去的东西压在下面,那么如果想拿出被压住的东西,必须要先取出顶部的东西,也就是后放进去的东西。换个说法就是先入后出。那它有点像什么呢?想象一下装在盘子里的若干张油饼。
对,他们是摞在一起的。如果想拿下面的油饼是不是要先拿开上面的呢?或许,这就是栈的根源。但是,又和“栈”这个字有什么关系呢?单纯的从释义上看,好似找不出什么关联性。但是当我们打开汉英词典:
对计算机中提及的“栈”的英文愿意是stack!我们一定要记得,是一群说英语的人创造了计算机,也是他们研究了初的算法。那么stack又是什么意思?
注意箭头指向的那一摞书们,和饼们的相处方式是不是很像!堆叠到一起。那个根源出来了,其实栈就是一种将数据依次“堆叠”的一种数据组织方式。
或者到这里,我们恍然大悟,哦,原来是这样!栈还有堆叠的意思。但是,我个人更觉得这是一种初期程序员之间的交流翻译吴缪。暂且放下这个不谈,至少我们明白一件事情,在某些领域,如果一个词汇很生涩,那么,不妨去查找一下他的英文愿意,或许你会有更深入的收获。
我们在来探讨下一个话题——“栈”stack,这种摞大饼大数据组织方式到底有什么用?
比如说,你有一些书,我们通常会这样摆放:
而不是这样:
为什么呢?当然是第二种摆放方式不方便拿其中的某一本书。可是在“栈”(stack)结构里面,“书”就是这样摆放的。那也就是说,“栈”(stack)不适合存放需要随机查找的东西。那它能做什么呢?
首先说说CPU里的“堆栈”。我们可以这样设想:一个CPU等同于一个完全没有记忆力的人,他只知道按照一份很详细的说明文档(也就是程序)来一步一步做某件事情,并且,他永远不会记得之前做过什么。我们在电影里常常会看到这样的情节,失忆症的人常常会随身携带一些本子和照片,然后按顺序把发生的事情记录下来,方便自己查阅。CPU也有这样的需求。
在CPU里,有一种机制叫做“中断”interrupt,就是中途插一嘴的意思。怎么插呢?比方说,你正在玩儿一个单机游戏,在更要通关的时候,外面突然有人敲门。那么是不是要把你的游戏暂停一下?然后再去开门。然后正在你去开门的路上,厨房的煤气报警器响起,是不是要赶紧去厨房看一下是不是误报警?确认是误报警后,我们是先去开门呢?还是继续打游戏呢?对于CPU来说,也会有同样的困惑。对于人,我们或许可以思考一下——哦,开门这件事器比较紧迫,应该先开门。但是对于CPU来说,又如何区分紧迫度呢?这就变成了一个很麻烦的问题。我们回头再想想“栈”,他是如何组织数据的?先入后出。玩游戏是先发生的事情,那么打断他的事情就是更紧迫的事情,开门虽然比游戏紧迫,但是他次于煤气报警,所以,它才是紧迫的事情。不过到现在也应该注意到了。紧迫的事情往往在后产生,又要被优先处理。
在CPU的中断机制里,每当cpu执行的一个任务被打断时,cpu就需要备份当前的处理状态,就像没有记忆的人,总是要记笔记拍照。那么cpu怎么区分优先次序呢?就像你吃盘子里的饼!先拿上面的。而存储数据的过程,就像你向盘子里放饼的过程。
再说说C语言分段里的“栈区”,我们都知道,局部自动变量分配到内存的“栈区”,栈区里的数据组织方式也类似摞饼,每当你调用了一个子函数,那么编译器会将子函数里的局部变量分配到栈区的栈顶位置(与当前函数的空间相邻),当子函数在再调用另一个函数是,也是会做同样处理。儿关于局部变量的释放,其实本质就是讲栈顶的一块空间的使用权归还回去,看起来就好像客栈一样,来人的时候开房,走人的时候退房。或许这也是stack会被翻译成“栈”的原由。
后在来说“栈”,这种单纯的逻辑结构。它和前两者一样,遵循类似先入后出的数据处理规则。
那这个“盒子“什么时候会用到呢?典型的例子,就是迷宫算法(具体细节可以自己搜索一下),我们可以用栈来存放已经走过的有效路线。也或者利用栈来模拟局部变量分配,实现将递归算法转换为非递归。也或者利用栈来优化,自己的程序处理逻辑,在实际问题解决中,如果你涉及到了临时保存数据,那么你可以尝试考虑一下使用栈,或许可以让自己的程序在逻辑上变得更加清晰明了。
简单的总结一下:所谓“栈”,其实就是一本 相互堆叠的便签儿。我们可以逐次备份自己要保存的信息,然后在反向依次处理。
计算机基础_001_栈是什么相关推荐
- 「计算机基础」栈结构
Stack Layout 说到栈,就必须要提及function函数,所以我们可以从一个函数中来看. 栈结构 void func(int a,int b) {int x,y;x = a+b;y = a- ...
- 计算机堆和栈的基本知识,计算机基础知识
# 12. 计算机基础 ### 操作系统的发展历史 ![](https://box.kancloud.cn/81dff3d119ab81119630ae30ccacd081_714x760.png) ...
- 关于计算机网络传输介质 下列叙述正确的是,《计算机基础》习题1-7
4. 算法的基本结构中包括( ) A.顺序结构 B.选择结构 C.循环结构 D.逻辑结构 5.关于Excel图表的数据源,下列叙述不正确的是( ) A. 可以修改图表的数据源 B. 图表的数据源必须是 ...
- 计算机及网络应用基础思维导图_计算机基础/算法/面试题 PDF+思维导图下载
之前为了面试,整理了九大应付面试的思维导图 + 一份 630 页的程序员内功修炼手册 + 一份计算机基础/算法/Java技术栈/Linux C++技术栈的资料.当时我就是靠着这份思维导图以及整理的 P ...
- 计算机基础扎实,到底是说什么?
hi, 大家好,今天和大家一起聊聊,计算机基础, 不管校招或社招面试,还是工作普升,还是技术成长,都要求需要扎实的计算机基础,职级(薪资)越高对基本功的要求就会越高,很多人可能不清楚,到底什么是扎实的 ...
- 计算机基础- -应用和硬件的关系
计算机基础- -应用和硬件的关系 文章目录 计算机基础- -应用和硬件的关系 一.应用和硬件的关系 1.支持硬件输入输出的IN指令和OUT指令 2.测试输入和输出程序 3.外围设备的中断请求 4.用中 ...
- 计算机基础- -认识汇编
计算机基础- -汇编语言 文章目录 计算机基础- -汇编语言 一.汇编语言和本地代码 二.通过编译器输出汇编语言的源代码 三.不会转换成本地代码的伪指令 四.汇编语言的语法是操作码+操作数 1.指令解 ...
- 计算机基础- -认识磁盘
计算机基础- -认识磁盘 文章目录 计算机基础- -认识磁盘 一.认识磁盘 程序不读入内存就无法运行 二.磁盘构件 1.磁盘缓存 2.虚拟内存 虚拟内存与内存的交换方式 三.节约内存 1.通过DLL文 ...
- 信息学竞赛计算机基础知识,信息学奥赛-计算机基础知识.doc
信息学奥赛-计算机基础知识 TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc303947525" 第一章 计算机基础知识 PAG ...
最新文章
- java map prefix_从键以特定表达式开头的Map中获取所有值的最快方法
- redis学习(二)
- 网络编程(part1)--IO及字节串
- easyui数据表格重置_数据库三种删除方式
- 关于oracle数据库论文,Oracle数据库研究论文 有关Oracle数据库的论文
- PTA-1021—— Deepest Root(最后两组数据错误)
- .NET Core通讯模块在Linux下的性能测试
- E20170603-ts
- 小程序“成语猜题”部分答案,总共28667题
- Mandriva本地安装
- X1000 SPI 时钟获取失败
- 解决爱快+openwrt双软路由,爱快设备列表中mac地址全部为openwrt的mac的问题
- Flask Request对象
- 金融小知识 | Fama-Macbeth回归
- python软件工程师月薪-软件工程师薪水知多少?
- 服务器显示屏 超出工作频率范围,win7显示器超出工作频率范围怎么解决
- NGINX 的域名解析缓存
- HDU 5643 King's Game 【约瑟夫环】
- Mac电脑如何启用root用户
- 超9成SCI论文发在国外!中文期刊到底差在哪?