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

时间:2015-02-11 15:21:57

标签: c# .net algorithm data-structures

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

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

由于

3 个答案:

答案 0 :(得分:2)

我建议您使用LinkedList,它可以为您提供所需的全部功能。有AddFirstAddLast方法可以让您在正面或背面添加项目,RemoveFirstRemoveLast方法可以让您从正面和背面移除。

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

答案 1 :(得分:2)

未经测试,但我认为这样的事情会起作用

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];
    }
}

答案 2 :(得分:1)

我已经确定最好的选择是使用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#中可以使用这个选项。