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后进先出)
队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)
C# 堆栈(Stack)和队列(Queue)的更多相关文章
- STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较
栈stack .队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- C++栈(stack)、队列(queue)、链表(list)的常用函数
C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...
- C++标准库类模板(stack)和 队列(queue)
在C++标准库(STL)中有栈和队列的类模板,因此可以直接使用 1.栈(stack):使用栈之前,要先包含头文件 : #include<stack> stack.push(elem); / ...
- 利用栈Stack实现队列(Queue)
实现说明: 入队时,将元素压入s1; 出队时,推断s2是否为空,如不为空,则直接弹出顶元素:如为空.则将s1的元素逐个"倒入"s2.把最后一个元素弹出并出队; 这个思路,避免了重复 ...
- 自定义栈Stack 和 队列Queue
自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek( ...
- C# 队列(Queue) 和堆栈(Stack)
队列 (Queue) ...
- stack, deque 和 queue的对比
stack, deque 和 queue这三个c++的STL的数据结构很类似但又各有不同. stack是堆栈,没有迭代器,特点是后进先出.用push()将元素压入栈中,top()返回栈顶元素,pop( ...
- 转【c语言】两个堆栈组成一个队列
假设有两个堆栈,分别是s1,s2,现在有数列“1,2,3,4,5”,要让这个数列实现先进先出的功能,也就是用两个堆栈组成一个队列,如何实现? 分析: 先将数列压入栈s1,数列在栈中由顶到底的元素为“5 ...
- 转:C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、Sort)
C#常用的集合类型(ArrayList类.Stack类.Queue类.Hashtable类.Sort) .ArrayList类 ArrayList类主要用于对一个数组中的元素进行各种处理.在Array ...
随机推荐
- 将服务器文件上传到ftp shell操作
date cd /home/data today_now=`date +%Y%m%d` #当前日期 cur_date=${today_now::} #echo ${cur_date} #判断是否文件生 ...
- jdbc批处理进行多条数据插入
package cn.linjun.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.S ...
- 未能找到类型或命名空间名称“Quartz”
C# 项目中使用Quartz必须使用.NetFrameWork4,而不能使用Client,否则的话会出现如题所示错误.
- C# 插件化方案(Add-In)
白话插件框架原理 WPF 插件开发(.NET Framework 3.5 System.Addin) 原文:AddIn Enabled Applications
- 【ShaderToy】新玩家~❤
最近对shader产生了浓厚兴趣,发现一个超有意思的网站shadertoy.com,各种有意思的shader,很多都是百行以内代码实现,除了学习,作为opgl的练习场所也很不错. 分享今天看的一篇sh ...
- python之造测试数据-faker(转载)
在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据. 在手动制造数据的过程中,可能需要花费大量精力和工作量,现在好了,有一 ...
- 写给自己看的新手java-环境配置
环境:win10. 第一步:下载jdk (类似于 net framework ) 环境运行库.地址:http://www.oracle.com/technetwork/java/javase/down ...
- 题解-HNOI2017 抛硬币
Problem loj2023 题意概述:甲抛掷 \(a\) 次硬币,乙抛掷 \(b\) 次硬币,问有多少种情况甲正面向上的次数比乙多,答案对 \(10^k\) 取模 对于 \(10\%\) 的数据, ...
- TCP-IP详解笔记5
TCP-IP详解笔记5 ICMPv4和ICMPv6: Internet控制报文协议 Internet控制报文协议(Internet Control Message Protocol, ICMP)与IP ...
- django模型层优化(关联对象) 懒加载和预加载 +长链接
懒加载 存在于外键和多对多关系不检索关联对象的数据调用关联对象会再次查询数据库 问题根源 查看django orm的数据加载,两次. 查询user,查询menu 预加载的方法 预加载单个关联对象--s ...