c#栈队列组合
Posted
技术标签:
【中文标题】c#栈队列组合【英文标题】:c# stack queue combination 【发布时间】:2010-12-20 09:06:23 【问题描述】:在 C# 中是否有一些已经定义的通用容器可以同时用作堆栈和队列? 我只想能够将元素附加到队列的末尾或队列的前面
谢谢
【问题讨论】:
【参考方案1】:检查LinkedList 类。
LinkedList<int> list = new LinkedList<int>();
list.AddFirst(1);
list.AddLast(2);
list.AddFirst(0);
【讨论】:
【参考方案2】:这是我的不可变双端队列的实现:
http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx
注意这是一个不可变双端队列。通常你可能认为队列是你改变的东西:
queue.Enqueue(10);
不可变队列始终保持不变;当您添加一个新元素时,它会返回一个全新的队列,因此您可以将其用作:
queue = queue.Enqueue(10);
如果您不再关心旧值。
【讨论】:
恕我直言,这似乎无法回答他的问题。 该链接有一个类,它定义了 OP 正在寻找什么。这个答案中给出的例子并没有真正表明这一点。 StriplingWarrior,我不知道你在说什么。海报要求一个现有的通用容器,其作用类似于堆栈或队列。这样的容器称为“双端队列”,我提供了一个指向源代码的链接以实现此类容器。问题的哪一部分没有得到回答? DeQueue 在这里是正确的名称,LinkedList 是 DeQueue 的一种可能实现。【参考方案3】:您想要的是 linked list - BCL 中有一个 - 具有 AddFirst 和 AddLast 方法
【讨论】:
【参考方案4】:这里有一个类可以帮助人们轻松实现这一点:
public class StackQueue<T>
private LinkedList<T> linkedList = new LinkedList<T>();
public void Push(T obj)
this.linkedList.AddFirst(obj);
public void Enqueue(T obj)
this.linkedList.AddFirst(obj);
public T Pop()
var obj = this.linkedList.First.Value;
this.linkedList.RemoveFirst();
return obj;
public T Dequeue()
var obj = this.linkedList.Last.Value;
this.linkedList.RemoveLast();
return obj;
public T PeekStack()
return this.linkedList.First.Value;
public T PeekQueue()
return this.linkedList.Last.Value;
public int Count
get
return this.linkedList.Count;
【讨论】:
不应该Enqueue(T obj)
方法调用AddLast
而不是AddFirst
?
@YehorHromadskyi 它被实现为在链表的前面入队并在后面出队。我没有发现任何错误,但如果我遗漏了什么,请告诉我。
你是对的,我的错,很抱歉造成混乱。
@YehorHromadskyi 没问题!【参考方案5】:
好老的List<T>
会做到的。
Add()
入队,Insert(0,T)
推送,Remove(0)
弹出/出队。
【讨论】:
插入和删除都是 O(n) 操作。一个链表将是 O(1) 酷 - 我的第一次投反对票。感谢您指出 O(n)。但是要挑剔,不是只有 O(n) 插入到 List 的前面而不是插入到末尾(因为它是基于数组的)吗? 这取决于您所指的费用。您是在谈论摊销成本,还是最坏的单一案例成本?将 n 项插入双时满列表末尾的摊销成本为 O(1)。将一个项目插入一个包含 n 个项目的 double-when-full 列表的最坏情况成本是 O(n)。以上是关于c#栈队列组合的主要内容,如果未能解决你的问题,请参考以下文章