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后进先出)

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

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

原文地址:https://www.cnblogs.com/1312mn/p/9155715.html

时间: 2024-10-08 12:39:23

C# 编程中的堆栈(Stack)和队列(Queue)的相关文章

简单计算器-栈stack和队列queue

一.技术总结 主要是一个中缀表达式,然后求值,一些加减乘除 第一步是把中缀表达式转化为后缀表达式 然后就是计算后缀表达式,计算出结果 主要是两个函数,一个是转化函数Change()还有一个是计算函数Cal() 二.参考代码: #include<iostream> #include<cstdio> #include<string> #include<stack> #include<queue> #include<map> using n

自定义栈Stack 和 队列Queue

自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek(); int size(); boolean empty(); void clear(); } 实现类 package com.test.custom; import java.util.ArrayList; import java.util.EmptyStackException; import java.

利用栈Stack实现队列(Queue)

实现说明: 入队时,将元素压入s1; 出队时,判断s2是否为空,如不为空,则直接弹出顶元素:如为空,则将s1的元素逐个"倒入"s2,把最后一个元素弹出并出队; 这个思路,避免了反复"倒"栈,仅在需要时才"倒"一次. package com.knowledgeStudy.threadLocal; import java.util.Stack; public class MyQueue { Stack<Object> s1 = new S

Unity Shaders and Effects Cookbook (6-3) 修改渲染队列Queue 来 修改渲染顺序

默认情况下,Unity是按照物体与 摄像机 的距离,来决定哪个物体先渲染.远处的物体先渲染,先渲染的物体,就会被都渲染的物体遮挡. Unity 提供了一些默认的渲染队列,比如最先被渲染的是 Background = 1000,然后是 Geometry =2000,一般在编辑器中创建的 物体都是处于 Geometry 这一渲染队列的. 有这么一个场景,里面有两个Sphere,一个远一些,一个近一些. 那么肯定的是,近一些的会遮挡远一些的,这是自然现象.远一些的先渲染. 但是有的时候,需要让远一点的

java中堆栈(stack)和堆(heap)

原文地址:http://blog.csdn.net/jerryao/article/details/874101 1.内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. (1)静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 (2)栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个

java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)

(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为 它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存 储分配相反,在栈式存储方案中,程序对

java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)

Java中的LinkedList?是采用双向循环列表实现的.利用LinkedList?可以实现栈(stack).队列(queue) 下面写两个例子学生类:int stuId; public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuN

161212、并发编程中的关于队列

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这个问题于是引入了生产者和消费者模式. 什么是生产者消费者模式 生产者

并发编程中的阻塞队列概述

1.简介 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作支持阻塞的插入和移除方法. 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满. 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空. 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程.阻塞队列就是生产者用来存放元素.消费者用来获取元素的容器. 在阻塞队列不可用时,插入.移除这两个附加操作提供4种处理