【C#】堆、栈和堆栈的区别
导读:今天看视频,就看到了堆、栈这一块了。记得当年初相见(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#】堆、栈和堆栈的区别的更多相关文章
- java堆、栈、堆栈的区别
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CP ...
- Java中的堆和栈以及堆栈的区别
在正式内容开始之前要说明一点,我们经常所说的堆栈堆栈是堆和栈统称,堆是堆,栈是栈,合在一起统称堆栈: 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Jav ...
- 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- 什么是“堆”,"栈","堆栈","队列",它们的区别?
堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树. 将根节点最大的堆叫做最大堆 ...
- 堆”,"栈","堆栈","队列"以及它们的区别
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
- c++中关于堆和堆栈的区别
在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区.里面的变量通常是局部 ...
- 转:C/C++内存管理详解 堆 栈
http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...
- 堆&栈的理解(转)
(摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...
随机推荐
- 进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用
参数发送进程: CString csCmd=AfxGetApp()->m_lpCmdLine; if (!csCmd.IsEmpty()) { pWndPrev->SendMessage( ...
- hihoCoder #1068 : RMQ-ST算法(模板)
AC G++ 826ms 146MB 思路: 时间复杂度O(nlogn). //#include <bits/stdc++.h> #include <iostream> #in ...
- SQL还原数据库
还原一个备份数据库的经历. 首先,手头上有工程文件及相应的数据库的备份. 步骤: 1.在工程文件里找到配置文件,我这个是在bin目录里找到config.ini 2.双击打开它,里面有一些数据库的相关信 ...
- Cordova插件中JavaScript代码与Java的交互细节介绍
在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...
- iOS 查看包架构信息
lipo -info libUMSocial_Sdk_4.2.a 查看包架构信息
- Java调用存储过程出现Bug,sql语法错误
因为SQL Server运行没有正常,检查了传入参数的值,发现问题,然后传入默认参数,解决了问题.
- js获取当前日期、前一天、后一天的日期的例子
<script> function addByTransDate(dateParameter, num) { var translateDate = "", dateS ...
- Java--容器/集合类(Collection)理解和使用
.数组和集合的比较 数组:长度固定,用来存放基本类型的数据 集合:长度不固定,用来存放对象的引用 二.集合类的基本概念 1.java.util包中提供了一些集合类,这些集合类也被称为容器. 常用的集合 ...
- LuoguP1351 联合权值 (枚举)
题目链接 枚举每个点,遍历和他相邻的点,然后答案一边更新就可以了. 最大值的时候一定是两个最大值相乘,一边遍历一边记录就好了. 时间复杂度.\(O(n)\) #include <iostream ...
- Mac OSX: 有线共享WiFi
首先连上有线 系统偏好设置->网络->点击左侧WiFi,再点击右下角[高级] 勾选[创建电脑对电脑网络],然后单击[好] 在顶部菜单栏击WiFi图标,如果WiFi未打开,则单击打开,如果已 ...