C# 编程中的堆栈(Stack)和队列(Queue)
一、什么是堆?(Heap)
堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
二、什么是栈?(Stack)
栈是有顺序的,是一片连续的内存域,保持着先进后出的原则,由系统自动分配和维护。
是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义。
表尾允许进行插入删除操作,称为栈顶(Top),另一端是固定的,称为栈底(Bottom)。
PS:
线性表(Linear List)是具有相同特性的数据元素的一个有限序列。
堆栈(Stack) 是一种特殊的线性表,是一种操作只允许在尾端进行插入或删除等操作的线性表。
顺序栈(Sequence Stack)是用一片连续的存储空间来存储栈中的数据元素。
链栈(Linked Stack)是用链式存储结构来存储的栈,链栈通常用单链表来表示。
三、什么是堆栈?
由堆和栈的概念,可以清晰的知道,堆栈是一种数据项按序排列的数据结构,只能在一端称为栈顶(top)对数据项进行插入和删除。
最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先出(LIFO)队列。
堆栈中定义了一些操作,两个最重要的是PUSH和POP。PUSH操作在堆栈的顶部加入一个元素,POP操作相反,在堆栈顶部移去一个元素, 并将堆栈的大小减一。
PS:通常所说的堆栈,实际上更偏向于指栈。
四、什么是队列?(Queue)
队列是一种特殊的线性表,它只允许在表的前端(Front)进行删除操作,而在表的后端(Rear)进行插入操作。
进行插入操作的表尾称为队尾(Rear),把进行其他操作的头部称为队头(Front)。
队列中没有元素时,称为空队列,队列具有先进先出(FIFO)的特点。
PS:
队列(Queue)是插入操作限定在表的尾部而其他操作限定在表的头部进行的线性表。
顺序队列(Sequence Queue)用一片连续的存储空间来存储队列中的数据元素,类似于顺序表,用一维数组来存放队列中的数据元素。
循环顺序队列(Circular sequence Queue)解决顺序队列的假溢出的方法是将顺序队列看成是首位相接的循环结构。
链队列(Linked Queue)队列的另外一种存储方式是链式存储,通常用单链表表示。
五、堆、栈之间的区别是?
堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第一个元素有最高的优先权
栈实际上就是满足先进后出的性质的数学或数据结构。
1、堆栈空间分配
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2、堆栈缓存方式
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3、堆栈数据结构区别
堆(数据结构):堆可以被看成是一棵树,如:堆排序。
栈(数据结构):一种先进后出的数据结构。
特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。
六、堆、栈、队列之间的区别是?
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(先进后出or后进先出)
队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)
优秀是一种习惯,欢迎大家关注学习

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
.NET中JSON的序列化和反序列化的几种方式
原文: .NET中JSON的序列化和反序列化的几种方式 一、什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 是JavaScript用来处理数据的一种格式,大部分是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进行处理,例如ajax等,是独立于语言和平台的轻量级的数据交换格式。 二、JSON语法 1、JSON语法规则 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型: ●对象表示为键值对 ●数据由逗号分隔 ●花括号保存对象 ●方括号保存数组 对象:对象在JS中...
-
下一篇
c#利用反射实现对类中的常量进行取值和对应常量的注释
原文:c#利用反射实现对类中的常量进行取值和对应常量的注释 因为业务需要,项目中有大量的错误码,还是通过分部类编写,报错之后返回一个错误码,无处可以方便的查询, 后来发现代码中每个错误码都有定义,而且都还有注释,因此考虑通过反射实现读取然后格式化形成错误码文档方便参阅。 读取注释 首先先读取注释,注释只要是标准的///生成的就能读取,因为每个项目可以生成一个对应的xml注释文档,这个功能默认 未开启,需要在要读取的类所在项目的名称上右键然后选择属性-生成-xml文档文件勾选上了并引入此项目,重新生成当前项目。 这样在输出目录中就存在了xml文档了。 实现代码 首先代码不多,其次,代码中有详细注释,就不多说了,代码如下 这是需要解析的类示例: /// <summary> /// 状态码类,存储状态码常量,这里的常量是http的状态码,用于反射解析 /// </summary> public class StatusCode { /// <summary> /// 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被...
相关文章
文章评论
共有0条评论来说两句吧...