2009-11-25 13 views
21

¿Hay algún contenedor genérico ya definido en C# que pueda usarse como pila y como cola al mismo tiempo? Sólo quiero ser capaz de añadir elementos, ya sea al final o al principio de la colaC# combinación de cola de pila

gracias

Respuesta

33

Compruebe la clase LinkedList.

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

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

Aquí es mi implementación de un deque inmutable:

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

Tenga en cuenta que este es un inmutable doble composición cola. Normalmente, probablemente piense en una cola como algo que mute:

queue.Enqueue(10); 

Una cola inmutable siempre es la misma; cuando se agrega un nuevo elemento, que le devuelve una nueva cola, por lo que se utiliza como:

queue = queue.Enqueue(10); 

si ya no se preocupa por el valor antiguo.

+2

Con el debido respeto, esto no parece responder a su pregunta. – StriplingWarrior

+1

El enlace tiene una clase que define lo que el OP estaba buscando. El ejemplo dado en esta respuesta realmente no muestra eso sin embargo. –

+3

StriplingWarrior, no tengo idea de lo que estás hablando. El póster solicita un contenedor genérico existente que actúa como una pila o una cola. Tal contenedor se llama "deque", y proporcioné un enlace al código fuente para una implementación de tal. ¿Exactamente qué parte de la pregunta no fue respondida? –

-1

Buena viejo List<T> lo hará.

Add() en enqueue, Insert(0,T) en push, Remove(0) en pop/dequeue.

+0

Insertar y Eliminar serán ambas operaciones O (n). Una lista enlazada será O (1) – thecoop

+0

Cool: mi primer voto negativo. Gracias por señalar el O (n). Pero para ser quisquilloso, ¿no sería solamente O (n) en inserciones al principio de la lista, pero no hasta el final (ya que está basado en matrices)? –

+0

Eso depende del costo al que te refieres. ¿Estás hablando del costo * amortizado *, o el * peor costo de un solo caso *? El costo amortizado de insertar n elementos en el final de una lista doble cuando está completo es O (1). El costo en el peor de los casos de insertar un elemento en una lista doble de elementos n es O (n). –

3

Aquí es una clase para ayudar a la gente poner en práctica esto fácilmente:

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