есть ли в С# некоторый уже определенный общий контейнер, который может использоваться как Stack и как очередь в одно и то же время? Я просто хочу иметь возможность добавлять элементы либо в конец, либо в начало очереди
спасибо
есть ли в С# некоторый уже определенный общий контейнер, который может использоваться как Stack и как очередь в одно и то же время? Я просто хочу иметь возможность добавлять элементы либо в конец, либо в начало очереди
спасибо
Проверьте класс LinkedList.
LinkedList<int> list = new LinkedList<int>();
list.AddFirst(1);
list.AddLast(2);
list.AddFirst(0);
Здесь моя реализация неизменяемого deque:
Обратите внимание, что это постоянная очередь с двойным концом. Обычно вы, вероятно, думаете о очереди как о чем-то, что вы мутируете:
queue.Enqueue(10);
Постоянная очередь всегда остается неизменной; когда вы добавляете новый элемент, он возвращает вам совершенно новую очередь, поэтому вы используете ее как:
queue = queue.Enqueue(10);
если вы больше не заботитесь о старом значении.
Что вам нужно, это связанный список - там один в BCL - AddFirst и AddLast методы
Здесь класс, который поможет людям реализовать это легко:
public class StackQueue<T>
{
private LinkedList<T> linkedList = new LinkedList<T>();
public void Push(T obj)
{
this.linkedList.AddFirst(obj);
}
public void Enqueue(T obj)
{
this.linkedList.AddFirst(obj);
}
public T Pop()
{
var obj = this.linkedList.First.Value;
this.linkedList.RemoveFirst();
return obj;
}
public T Dequeue()
{
var obj = this.linkedList.Last.Value;
this.linkedList.RemoveLast();
return obj;
}
public T PeekStack()
{
return this.linkedList.First.Value;
}
public T PeekQueue()
{
return this.linkedList.Last.Value;
}
public int Count
{
get
{
return this.linkedList.Count;
}
}
}
Старый добрый List<T>
сделает это.
Add()
, чтобы вставить, Insert(0,T)
нажать, Remove(0)
, чтобы поп/dequeue.