哪种数据结构允许从两侧添加,但强制执行容量?

Which data structure allows adding from both sides, but enforces a capacity?

我需要一个具有 capacity,但也允许 adding an item from either the front or the back 的数据结构。每次添加一个项目时,必须从另一端删除一个项目。我的第一个想法是,这听起来与 Deque 非常相似。

是否有提供此功能的现有数据结构,还是我必须自己创建它?如果确实存在,does the .Net library have an implementation?

谢谢

我建议您使用 LinkedList,它可以提供您需要的所有功能。有 AddFirstAddLast 方法可以让您在前面或后面添加项目,还有 RemoveFirstRemoveLast 方法可以让您从前面和后面删除。

当然,还有一个 Count 属性 告诉您列表中有多少项,因此您可以强制执行您的容量要求。

我认为最好的选择是使用 array of T for the backing structure,并使用 reference Front and a reference Back 来表示结构的虚拟开始和结束。我还将存储一个方向枚举,它将有效地指示结构面向哪个方向(最后一次添加操作是在前面还是后面,或者如果没有执行任何添加操作,则为默认值)。 This way, I can also implement an indexer with O(1) complexity,而不是迭代集合。

感谢您的所有回复。出于某种原因,我认为我需要在支持结构中移动数据。我没有意识到这个选项在 C# 中是可行的。

未测试,但我认为类似这样的方法可行

public class Stack<T>
{
    private T[] arr;
    readonly int m_Size;
    int m_StackPointer = 0;
    public T this[int i]
    {
        get
        {
            if (i >= m_Size)
                throw new IndexOutOfRangeException();
            int pointer = i + m_StackPointer;
            if (pointer >= (m_Size)) pointer -= m_Size;
            return arr[pointer];
        }
    }
    public void AddStart(T addItem)
    {
        m_StackPointer--;
        if (m_StackPointer < 0) m_StackPointer = m_Size - 1;
        arr[m_StackPointer] = addItem;
    }
    public void AddEnd(T addItem)
    {
        arr[m_StackPointer] = addItem;
        m_StackPointer++;
        if (m_StackPointer >= m_Size) m_StackPointer = 0;
    }
    public Stack()
        : this(100)
    { }
    public Stack(int size)
    {
        m_Size = size;
        arr = new T[size];
    }
}