C# 编程中的堆栈(Stack)和队列(Queue)

简介: 原文:C# 编程中的堆栈(Stack)和队列(Queue)一、什么是堆?(Heap)      堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
原文: 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后进先出)

     队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

 

优秀是一种习惯,欢迎大家关注学习

目录
相关文章
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
15 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
70 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
53 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
59 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
37 0
|
3月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
71 2
|
4月前
|
C# C++
C# 高效率编程 “多线程” 的基本使用
C# 高效率编程 “多线程” 的基本使用
|
6月前
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
48 0
|
8月前
|
数据采集 算法 Linux
Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:VCXG双快门操作(C#)
37 0