c#queue能从头塞回去吗

 我来答
Tech_Monkeye5
2017-10-31 · TA获得超过984个赞
知道小有建树答主
回答量:330
采纳率:92%
帮助的人:80.7万
展开全部
首先说一下,Queue队列本身就是实现先进先出的一个数据结构,从队列尾部添加元素,而从队列的头部取出元素,没有任何规则可以从头部加入一个元素的,Queue只提供从队尾加入元素的成员方法Enqueue();所以不能从头部添加元素的。
Dequeue()成员方法会在访问头部元素并将其从队列中移除;如果你是需要首个元素“移出后立即放回去”差不多的意思就是访问首个元素而不移除,那么Peek()成员方法就是访问首个头部元素,并不从队列中移除——这或许是你的需要。
事实上,不移队与移除后放回去的需求并不一样,如果你是先进行移除,并检查头部元素是否为指定的条件,达到指定条件再放回去——不妨使用Peek()先检查元素,达不到条件则移出也是一样的,不过我想不到这种作法到底是什么样的目的——如果不移除第一个元素,你可能永远操作不到第二个元素!如果你真有这方面的目的时不如使用线性表。
再者我说过你的移除后再塞回去的目的,同时涉及到另一个复杂的问题——多线程,在多线程操作时,这种行为与检查Peek()是本身有区别的(其实把你的移除——放回做为两个操作,并不是一个原子的操作)。所以这里边的涉及的问题会导致其他情况的发生。
就算如此,Dequeue/Enqueue及Peek()等相关的操作也不是什么原子操作,所以如果真是在多线程使用时不妨考虑另一个类ConcurrentQueue,这个类其实没有啥其他的作用,就是Queue的线程安全版本而已。
说白了,Queue不是线程安全版本,但性能较高,而ConcurrentQueue是线程安全版本,如果是多线程操作时,可以直接使用这个,而避免使用Queue,然后在进行多线程时的封装操作。
所以我不知道你为什么在元素移除后还要放回去是出于什么样的考虑,如果真存在这种考虑的情况下,我估计你选错了类型,使用的不应该是队列。几种基础的数据结构在.net类库中均有实现,比如队列(Queue),栈(Stack), 泛型(List)等等,对于链表也可以很容易地构造出来这样的类来。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式