¿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
¿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
Compruebe la clase LinkedList.
LinkedList<int> list = new LinkedList<int>();
list.AddFirst(1);
list.AddLast(2);
list.AddFirst(0);
Lo que queremos es un linked list - Hay uno en el BCL - que tiene AddFirst y AddLast métodos
Aquí es mi implementación de un deque inmutable:
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.
Buena viejo List<T>
lo hará.
Add()
en enqueue, Insert(0,T)
en push, Remove(0)
en pop/dequeue.
Insertar y Eliminar serán ambas operaciones O (n). Una lista enlazada será O (1) – thecoop
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)? –
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). –
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;
}
}
}
Con el debido respeto, esto no parece responder a su pregunta. – StriplingWarrior
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. –
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? –