我知道堆栈是最好和最简单的方法,但是有可能获得队列中的最后一个元素而不必出列任何东西吗?
答案 0 :(得分:2)
您可以这样做:
// Assumes T is a reference type, if it's a value type, then
// you will get an instance with the bits zeroed out.
T item = queue.LastOrDefault();
这里的问题是,每次想要获取队列中的最后一项时,都必须遍历队列中的每个项。
如果您有权访问队列的第一个和最后一个元素,那么您可能需要考虑double-ended queue。
答案 1 :(得分:1)
如果你真的需要,你可以使用它,但考虑使用不同的数据结构:
public static class QueueExtensions<T>
{
const BindingFlags _flags =
BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance;
private static readonly FieldInfo _array =
typeof(Queue<T>).GetField("_array", _flags);
private static readonly FieldInfo _size =
typeof(Queue<T>).GetField("_size", _flags);
public T LastItem(this Queue<T> value)
{
if (value == null)
throw new ArgumentNullException("value");
if (value.Count == 0)
throw new ArgumentException("The queue cannot be empty.", "value");
var array = (T[])_array.GetValue(value);
var size = (int)_size.GetValue(value);
return array[size - 1];
}
}
答案 2 :(得分:0)
您可以使用LINQ&#39; Enumerable.Last()
method(其中myQueue
是您的队列的名称):
var lastElement = myQueue.Last();
虽然正如其他人所提到的,如果你发现自己经常需要这样做,你可能想要考虑使用不同的数据结构。例如,List<T>
:
var myElement = myList[myList.Length - 1];
答案 3 :(得分:0)
不,您必须将队列转换为其他集合(使用ToList
或ToArray
)才能执行此操作。这将有效地使队列中的所有内容出列。
请记住,通过需要队列中的最后一项,您已经有效地证明您使用了错误的集合来保存数据。请考虑将您的集合更改为另一种类型,以提供您需要的所有操作。
答案 4 :(得分:0)
队列没有设置为快速执行该操作,因此您可以做的最好是O(n)。
如果您导入System.Linq,您可以写:
myQueue.Last()
答案 5 :(得分:0)
对于 java 8 流,您可以执行以下操作:
queue.stream().reduce((first, second) -> second).get();