Подтвердить что ты не робот

Комбинация очереди стека С#

есть ли в С# некоторый уже определенный общий контейнер, который может использоваться как Stack и как очередь в одно и то же время? Я просто хочу иметь возможность добавлять элементы либо в конец, либо в начало очереди

спасибо

4b9b3361

Ответ 1

Проверьте класс LinkedList.

LinkedList<int> list = new LinkedList<int>();

list.AddFirst(1);
list.AddLast(2);
list.AddFirst(0);

Ответ 2

Здесь моя реализация неизменяемого deque:

http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx

Обратите внимание, что это постоянная очередь с двойным концом. Обычно вы, вероятно, думаете о очереди как о чем-то, что вы мутируете:

queue.Enqueue(10);

Постоянная очередь всегда остается неизменной; когда вы добавляете новый элемент, он возвращает вам совершенно новую очередь, поэтому вы используете ее как:

queue = queue.Enqueue(10);

если вы больше не заботитесь о старом значении.

Ответ 4

Здесь класс, который поможет людям реализовать это легко:

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

Ответ 5

Старый добрый List<T> сделает это.

Add(), чтобы вставить, Insert(0,T) нажать, Remove(0), чтобы поп/dequeue.