25 votes

c# combinaison de file d'attente de pile

Existe-t-il en C# un conteneur générique déjà défini qui peut être utilisé comme pile et comme file d'attente en même temps ? Je veux juste pouvoir ajouter des éléments soit à la fin, soit à l'avant de la file d'attente.

merci

39voto

João Angelo Points 24422

Vérifiez le LinkedList classe.

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

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

13voto

Eric Lippert Points 300275

Voici mon implémentation d'un deque immuable :

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

Remarquez que c'est un immuable double-ended-queue. Normalement, vous pensez probablement qu'une file d'attente est quelque chose que vous mutez :

queue.Enqueue(10);

Une file d'attente immuable reste toujours la même ; lorsque vous ajoutez un nouvel élément, elle vous redonne une file d'attente entièrement nouvelle, que vous pouvez donc utiliser comme :

queue = queue.Enqueue(10);

si vous ne vous souciez plus de l'ancienne valeur.

4voto

thecoop Points 23695

Ce que vous voulez, c'est un liste liée - il y en a un dans le BCL - qui a AddFirst y AddLast méthodes

3voto

David Sherret Points 3205

Voici une classe pour aider les gens à mettre cela en œuvre facilement :

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

-1voto

Ed Power Points 3179

Bon vieux List<T> le fera.

Add() à mettre en file d'attente, Insert(0,T) à pousser, Remove(0) pour le pop/dequeue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X