Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   TList, TQueue, TStack (https://www.clubdelphi.com/foros/showthread.php?t=17117)

marlenezorrilla 23-12-2004 18:15:37

TList, TQueue, TStack
 
:o Me podria alguien decir, para que se usan las componentes TQueue, TStack y TList?.

Es que tengo que preparar una clase sobre esos temas y no tengo idea de su uso.

Ulises_SPI 24-12-2004 04:33:32

Clases TList, TQueue y TStack
 
Que tal. Te cuento que las clases TList, TQueue y TStack son estructuras de almacenamiento definidas en Delphi para que no tengas que programarlas. Corresponden a la implementación de una lista vinculada, una cola y una pila, respectivamente. Solo he utilizado el TList, pero creo que el estilo es el mismo en las tres clases (deberías verificarlo).
Con respecto al TList puedo decirte que es una lista hecha con punteros genéricos (pointer) por lo que puedes poner cualquier cosa en la lista, es decir, no necesariamente elementos del mismo tipo en cada uno de los nodos. Lo importante es que sepas que hay en el nodo para poder hacer un cast al objeto antes de recuperar la información almacenada en el nodo de la lista.
La clase TList provee un función de ordenamiento utilizando quicksort, y solamente debes proveerle una función que retorna -1,0 o 1 segun sea un elemento menor, igual o mayor a otro. Todo esto que te cuento esta disponible en el help del delphi, pero si necesitas mas ayuda, avisa. Saludos, Ulises

Lepe 24-12-2004 15:10:37

Yo si he usado TQueue y TStack, verifico que identico a Tlist en cuanto a creación, difiere en que para añadir debes usar el método Push y para extraer un elemento usar Pop, tambien permite consultar el elemento de la cima, es decir, en el caso de Tqueue sería el primero de la cola, y en el caso de Tstack, el elemento que se halla arriba de la pila; en ambos casos sin necesidad de extraerlo, el método en cuestion se llama Peek.

Por supuesto aqui no tiene sentido ordenar estos objetos.

Código Delphi [-]

type Tlibro = class(Tobject)
private
  Fnombre:String;
public
  property Nombre:String read Fnombre Write Fnombre;
end;

var 
   Libros : TStack;
   libro : Tlibro;
begin
  Libros := TStack.create(true); // creamos la pila

  libro := Tlibro.create; // creamos un objeto libro
  libro.nombre := 'Delphi Maniacs';
  
  libros.push(libro); introducimos el libro en la pila.

end;
Por supuesto no he controlado errores de memoria o de creación... pero basicamente es esto. No te olvides liberar la pila con Libros.Free que automaticamente liberará todos los libros que haya en la pila.

Saludos

Edgar++ 28-12-2004 22:55:50

Holas!

Esas clases implementan un parte de lo que se conoce como TAD (Tipo Abstracto de Dato), esto es básicamente estructuras de almacenamiento de datos de la vida cotidiana com las pilas de libros o las colas de los cines o las listas de compras implementadas en computación. Existe muchisimos tipos de TAD, otros ejemplos son las tablas de dispersión o Hash, los arboles binarios, listas doblemente enlazadas, grafos, diccionarios, todo tipo de arboles, etc. Cada tipo se utiliza en funcion de lo que se necesite, por ejemplo para búsquedas rápidas conviene usar tablas hash o arboles binarios. No es dificil implementar estos tads, lo que hay que hacer es pensar las funciones primitivas básicas que deben tener para su utilización, aquellas que mediante su combinación se pueden crear otras funcionalidades.

Aca va un tipico ejemplo de como implementar una lista:

Código Delphi [-]
type
   PListItem = ^TListItem;
   TListItem = record
      next: PListItem;
      data: Pointer;
   end;
   TLinkedList = object
      procedure Add(data: Pointer);
      procedure Remove(data: Pointer);
      { otros procedimientos utiles que permitan
         por ejemplo recorrer la lista, etc }
end;

Thoronluin 29-07-2010 21:58:17

Hola a tod@s:

Perdón por mi ignorancia :( pero estoy intentando crear una cola con Tqueue y encuentro poca información o información errónea.

Tengo un par de preguntas:confused::
  1. Lo que meta el la pila ha de ser una clase no puede ser una variable, por ejemplo un record con varios campos.
  2. ¿Para liberar la memoria bastaría con lo siguiente?

Código Delphi [-]
libro := libros.pop;
libro.free;

Saludos.

delphi.com.ar 29-07-2010 22:12:01

Con respecto a la pregunta original, creo que es algo mas simple, todas son clases que implementan las siguientes estructuras de datos:

TList es una lista simple.
TQueue es una pila FIFO (first-in first-out)
TStack es una pila LIFO (last-in first-out)


Saludos!

Cita:

Empezado por Thoronluin (Mensaje 372043)
Perdón por mi ignorancia :( pero estoy intentando crear una cola con Tqueue y encuentro poca información o información errónea.

Código Delphi [-]
var
  Q: TQueue;
begin
  Q := TQueue.Create;
  try
    Q.Push(Item);  { Agrega un item a la pila }
    ...
    Item := Q.Pop; { Quita un item y devuelve el mismo }
  finally
    Q.Free;
  end;


Cita:

Empezado por Thoronluin (Mensaje 372043)
Lo que meta el la pila ha de ser una clase no puede ser una variable, por ejemplo un record con varios campos.

TQuote es un TOrderedList list, y este tipo de listas utilizan punteros, o sea que puedes perfectamente asignar la dirección de un registro.

Cita:

Empezado por Thoronluin (Mensaje 372043)
¿Para liberar la memoria bastaría con lo siguiente?

Solo liberará el espacio de memoria de la clase, no de sus objetos referenciados, tienes que eliminarlos "manualmente", y puedes usar la misma pila para acceder a ellos.


Saludos!

Thoronluin 29-07-2010 23:04:13

Muchas gracias delphi.com.ar:

Tus explicaciones han sido claras y concisas :). Con la tuya más el resto de aportaciones del hilo voy a meterme en faena con las colas ya que las tengo más claras.

Saludos.

Thoronluin 04-08-2010 21:10:07

He estado trabajando con lo explicado y funciona genial. :)

Otra pregunta. Me gustaría ir más allá y hacer una lista con las colas pero no tengo claro como acceder a las colas. Yo hago lo siguiente

Código Delphi [-]
var
  ....
  lista: Tlist;
  aux_Elemento: Telemeto;
  aux_Cola: Tqueue;
  ...

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  lista:=tlist.Create;
  for i:=0 to 3 do
  begin
    aux_Cola:=tqueue.Create;
    lista.Add(aux_Cola);
  end;
end;

procedure TForm1.I1Click(Sender: TObject); 
// Pulsado un botón introducimos un texto
begin
  aux_Elemento:=Telemento.Create;
  aux_Elemento.cadena:=Texto_Entrada1.Text;
  aux_cola:=lista.Items[0];
  aux_cola.Push(aux_elemento);
  Texto_Contador1.Text:=inttostr(aux_cola.Count);
end;

No sé si es la manera estándar o si existiría una forma más directa :confused:, sé que lo siguiente no es correcto:

Código Delphi [-]
lista.Items[0].Push(aux_Elemento);

Saludos y gracias por la paciencia.

delphi.com.ar 04-08-2010 21:20:35

Al ver tu código me surgen varias dudas...
  1. ¿Tienes claro que estas creando cuatro pilas y usando solo una?
  2. ¿No te convendrían las variables auxiliares que sean de uso local definirlas localmente y no globalmente?


Cita:

Empezado por Thoronluin (Mensaje 372612)
No sé si es la manera estándar o si existiría una forma más directa :confused:, sé que lo siguiente no es correcto:

Código Delphi [-]
lista.Items[0].Push(aux_Elemento);

Con mas directa te refieres a algo como:

Código Delphi [-]
TQueue(lista.Items[0]).Push(aux_Elemento);

Saludos!

Thoronluin 04-08-2010 21:44:06

Buenas tardes delphi.com.ar:

Cita:

Empezado por delphi.com.ar (Mensaje 372615)
Al ver tu código me surgen varias dudas...
  1. ¿Tienes claro que estas creando cuatro pilas y usando solo una?
  2. ¿No te convendrían las variables auxiliares que sean de uso local definirlas localmente y no globalmente?

Te respondo por orden:
  1. Sí, el código es un poco más largo pero sólo puse el de una de las colas. Para entender bien los conceptos cree 4 edits de entrada, 4 de salida, 4 botones de entrada, 4 de salida y 4 edits (aunque hubiera valido un label) para los contadores; con ellos introduzco y extraigo cadenas de las lista de colas. Después lo complicaré más para lo que quiero hacer.
  2. Lo de las variables locales es cierto, con el afan de crearme un ejemplo de forma rápida presté poca atención a ese detalle.

Cita:

Empezado por delphi.com.ar (Mensaje 372615)
Con mas directa te refieres a algo como:


Código Delphi [-]
TQueue(lista.Items[0]).Push(aux_Elemento);

Eso precisamente, magnífico.

Muchísimas gracias por tu ayuda, como siempre das en el clavo.

Saludos


La franja horaria es GMT +2. Ahora son las 23:55:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi