【发布时间】:2010-12-20 09:06:23
【问题描述】:
在 C# 中是否有一些已经定义的通用容器可以同时用作堆栈和队列? 我只想能够将元素附加到队列的末尾或队列的前面
谢谢
【问题讨论】:
标签: c# stack queue containers
在 C# 中是否有一些已经定义的通用容器可以同时用作堆栈和队列? 我只想能够将元素附加到队列的末尾或队列的前面
谢谢
【问题讨论】:
标签: c# stack queue containers
检查LinkedList 类。
LinkedList<int> list = new LinkedList<int>();
list.AddFirst(1);
list.AddLast(2);
list.AddFirst(0);
【讨论】:
这是我的不可变双端队列的实现:
注意这是一个不可变双端队列。通常你可能认为队列是你改变的东西:
queue.Enqueue(10);
不可变队列始终保持不变;当您添加一个新元素时,它会返回一个全新的队列,因此您可以将其用作:
queue = queue.Enqueue(10);
如果您不再关心旧值。
【讨论】:
您想要的是 linked list - BCL 中有一个 - 具有 AddFirst 和 AddLast 方法
【讨论】:
这里有一个类可以帮助人们轻松实现这一点:
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?
好老的List<T> 会做到的。
Add() 入队,Insert(0,T) 推送,Remove(0) 弹出/出队。
【讨论】: