我需要一个capacity
的数据结构,但也允许adding an item from either the front or the back
。每次添加项目时,必须从对端移除一个项目。我的第一个想法是,这个声音与Deque
非常相似。
是否存在提供此功能的现有数据结构,还是我必须自己创建?如果确实存在,does the .Net library have an implementation?
由于
答案 0 :(得分:2)
我建议您使用LinkedList,它可以为您提供所需的全部功能。有AddFirst
和AddLast
方法可以让您在正面或背面添加项目,RemoveFirst
和RemoveLast
方法可以让您从正面和背面移除。
当然,还有一个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#中可以使用这个选项。