导读:今天看视频,就看到了堆、栈这一块了。记得当年初相见(VB视频),劈头盖脸一阵蒙,什么都不知道,那时候师傅叫我挂起来,说我随着学习的进度,慢慢的就会懂了。现在,学到了这里,想着自己对自己从前的问题进行解答。可能解答的不够完整不够好,等到我又学了新东西,又有了想法的时候,再回头更改。嘿嘿,先看看当年的问题哈。

一:基本定义

堆(heap):堆是一种经过排序的树形数据结构,每个结点都有一个值。

栈(stack):它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。(PS:颇有砌墙的砖——后来者居上的赶脚。)

堆栈:由堆和栈的概念,可以清晰的知道:堆栈,是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

PS:结合查阅的资料,通常所说的堆栈,实际上更偏向于指栈。

二、基本对比

1,申请方式

heap:程序员自己申请,并指明大小。

stack:由系统分配。

2,申请效率

heap:效率较高,速度较快,但程序员无法对其进行控制。

stack:由new分配的内存,相对效率和速度都较低,且容易产生碎片,但由于是程序员自己申请操作,灵活性强,使用方便。

3,存储的数据类型

stack:存储值类型,即存储固定长度的数据。比如:整数、字符、结构、布尔、枚举等。每个程序在执行时都有自己的堆栈,其他程序不能访问该堆栈。

heap:存储引用类型。比如:类、接口、数组等。

PS:在网上搜索的资料还有很多,但结合视频,目前自己理解的就只有这些咯。

三、相关名词

1,压栈(进栈、入栈):用push表示,就是把数据放入栈中,从栈顶放入,有先进后出的特点!

2,清栈:清空栈中所有的数据。

3,出栈:用POP表示,它是和压栈相反的概念,即把数据从栈中取出来。出栈时从栈顶取出。

形象化解释:有二层楼,拿着砖头,继续往上盖楼,就是压栈。取下砖头拆楼,硬生生把楼房给弄成平房,就是出栈。然后,要是看这座楼不顺眼,直接来包***炸了,灰都不剩那种,就叫清栈。

注意问题:压栈:需要考虑是否满栈,比如一座楼根据地基的承受能力,目前高度达到了极限,那么,就不能往上继续盖。

清栈:需要考虑栈是否为空,空栈,不需要清栈。

出栈:每次出栈都只能出顶栈。(PS:我在想出栈是不是得留下点东西,要是什么都不留,岂不成了清栈了)

4,堆栈溢出:就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了旧的堆栈数据。 (PS:有点像数组的下标越界问题)

四、个人感受

总算是对以前VB中的遗留问题,做了一丢丢的解答了,虽然还不够全面,但目前很满足了。才发现,有的问题真的可以挂起来,随着学习的深入,自己就会慢慢的了解。如果当时我就去纠结这么一个问题,我肯定会耽误很长时间。其实,说到底,还是自己的知识积累不够。

调侃的说:突然有点佩服我的记忆力了(老师不要说我哈,我知道记是记不住的,可是,我这回就是记住了)。真的,我一看视频中出现的这个堆和栈的名词,顿时就想到了我去年在今目标上发的问题更新协商,嘿嘿!因此,也就多留意了一下,查了很多资料,知道了很多扩展性的东西,这回,又把看不懂的挂起来了,神呀,我什么时候才能都懂了哦,赐予我力量吧,阿门。

在回头看这个堆栈问题的时候,我也顺便看了一下当时提出的别的一些问题,比如类的实例化个数问题、布尔型定义的问题、线程缓冲池(单线程、公寓式线程)、面向对象的继承多态等问题。还记得当时师傅说:有些东西,它就是那样的,没有为什么。学到现在,真的就是那样,没有多余的为什么 ,他就是老师说的王八的屁股。继续努力,觉得自己挺差劲的,那时候提出的一些问题,到现在,也都还剩了一大堆没能解决掉,加油,总会有抛开问题全明白的一天。



请大家多多指教,谢谢!

【C#】堆、栈和堆栈的区别的更多相关文章

  1. java堆、栈、堆栈的区别

    1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...

  2. Java中的堆和栈以及堆栈的区别

    在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈: 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Jav ...

  3. 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...

  4. 什么是“堆”,"栈","堆栈","队列",它们的区别?

    堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树. 将根节点最大的堆叫做最大堆 ...

  5. 堆”,"栈","堆栈","队列"以及它们的区别

    如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...

  6. java中堆和堆栈的区别

    java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...

  7. c++中关于堆和堆栈的区别

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.       栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区.里面的变量通常是局部 ...

  8. 转:C/C++内存管理详解 堆 栈

    http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...

  9. 堆&栈的理解(转)

    (摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...

随机推荐

  1. hihocoder1822 战舰日常任务

    思路: 使用堆即可. 实现: #include <iostream> #include <map> #include <vector> #include <c ...

  2. 最详细的github快速入门教程

    一:下载github 二:安装GitHub 下载之后点击 进行安装过程,安装之后桌面上会有两个图标,如下图 三:新建项目 GitHub是图形界面模式,Git Shell是命令行模式,在Windows系 ...

  3. 关闭windows7/8的自动升级到windows10

    办公室的电脑已经有好几台自动升级到windows10了. 由于用着很不习惯都要求改回windows7. 升级了就不支持退回去,只能是全部删除重新安装了,很是麻烦.但是也没有看到哪里有可以关闭自动升级的 ...

  4. VS2010中C++ 出现fatal error LNK1169: 找到一个或多个多重定义的符号

    一般是函数重定义造成的 例如定义了两个 sum(x,y)函数

  5. 使用vue做移动端瀑布流分页

    讲到瀑布流分页有一个方法一定是要用到的 pullToRefresh() 这个也没什么好解释的,想了解的可以去百度一下 下面上代码 <div id="main" class=& ...

  6. python基础一 day11 装饰器复习

    # 复习# 讲作业# 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装 ...

  7. rpn网络结构再分析

    这是rpn网络train阶段的网络结构图 rpn_conv1之前的网络是特征提取层,也是和fast rcnn共享的层.rpn_conv1是一层1*1的卷积,这一层是单独为rpn网络多提取一层特征,这一 ...

  8. 【转载】WPF DataGrid 性能加载大数据

    作者:过客非归 来源:CSDN 原文:https://blog.csdn.net/u010265681/article/details/76651725 WPF(Windows Presentatio ...

  9. 浅谈倍增LCA

    题目链接:https://www.luogu.org/problemnew/show/P3379 刚学了LCA,写篇blog加强理解. LCA(Least Common Ancestors),即最近公 ...

  10. Java InputStream、String、File相互转化

    String --> InputStreamByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); Inp ...