像Queue这样的数据结构,可以访问最后一个元素

本文关键字:访问 最后一个 元素 数据结构 Queue | 更新日期: 2023-09-27 18:25:53

我需要一个像Queue这样的数据结构。只有第一个元素可以退出,并且应该将新元素添加到队列的末尾。我还需要访问最后一个元素。

System.Collections.Queue具有我需要的所有功能,除了最后一个。

我想知道有没有像这样的内置数据结构?

像Queue这样的数据结构,可以访问最后一个元素

C#LinkedList类正是您所需要的。

请参阅https://stackoverflow.com/a/1798358/2394945

根据注释和其他答案,最好的方法是创建自己的队列,但实现性能最好的队列是重复的(因为它已经存在于c#中)。

因此,我只需创建一个MyQueue类,并使用System.Collections.Generic.Queue<T>作为其内部数据结构。这是代码:

/// <summary>
/// A generic first in first out data structure with access to last element.
/// </summary>
/// <typeparam name="T">The specific data type for this queue.</typeparam>
public class MyQueue<T>
{
    #region Varibles
    private Queue<T> _inner;
    private T _last;
    #endregion
    #region Properties
    /// <summary>
    /// Number of elements of this Queue.
    /// </summary>
    public int Count
    {
        get
        {
            return _inner.Count;
        }
    }
    /// <summary>
    /// The inner Queue in this structure.
    /// </summary>
    public Queue<T> Inner
    {
        get
        {
            return _inner;
        }
    }
    #endregion
    public MyQueue()
    {
        _inner = new Queue<T>();
    }
    #region Methods
    /// <summary>
    /// Adds an object to the end of the queue.
    /// </summary>
    /// <param name="item">Specific item for add.</param>
    public void Enqueue(T item)
    {
        _inner.Enqueue(item);
        _last = item;
    }
    /// <summary>
    /// Return and removes the first item in the queue.
    /// </summary>
    /// <returns>The first item in queue.</returns>
    /// <exception cref="InvalidOperationException">InvalidOperationException</exception>
    public T Dequeue()
    {
        if (_inner.Count > 0)
            return _inner.Dequeue();
        else
            throw new InvalidOperationException("The Queue is empty.");
    }
    /// <summary>
    /// Returns the first item in the queue without removing it.
    /// </summary>
    /// <returns>The first item in the queue.</returns>
    public T Peek()
    {
        return _inner.Peek();
    }
    /// <summary>
    /// Returns the last item in the queue without removing it.
    /// </summary>
    /// <returns>The last item in the queue.</returns>
    public T Last()
    {
        return _last;
    }
    /// <summary>
    /// Clears all items in the queue.
    /// </summary>
    public void Clear()
    {
        _inner.Clear();
    }
    #endregion
}