Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2004
marlenezorrilla marlenezorrilla is offline
Registrado
 
Registrado: dic 2004
Posts: 1
Poder: 0
marlenezorrilla Va por buen camino
TList, TQueue, TStack

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.
Responder Con Cita
  #2  
Antiguo 24-12-2004
Ulises_SPI Ulises_SPI is offline
Registrado
 
Registrado: dic 2004
Posts: 2
Poder: 0
Ulises_SPI Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 24-12-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 28-12-2004
Avatar de Edgar++
Edgar++ Edgar++ is offline
Miembro
 
Registrado: dic 2004
Ubicación: Buenos Aires
Posts: 15
Poder: 0
Edgar++ Va por buen camino
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;
Responder Con Cita
  #5  
Antiguo 29-07-2010
Thoronluin Thoronluin is offline
Miembro
 
Registrado: feb 2009
Posts: 39
Poder: 0
Thoronluin Va por buen camino
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:
  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.
Responder Con Cita
  #6  
Antiguo 29-07-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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 Ver Mensaje
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 Ver Mensaje
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 Ver Mensaje
¿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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 29-07-2010
Thoronluin Thoronluin is offline
Miembro
 
Registrado: feb 2009
Posts: 39
Poder: 0
Thoronluin Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 04-08-2010
Thoronluin Thoronluin is offline
Miembro
 
Registrado: feb 2009
Posts: 39
Poder: 0
Thoronluin Va por buen camino
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 , sé que lo siguiente no es correcto:

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

Saludos y gracias por la paciencia.
Responder Con Cita
  #9  
Antiguo 04-08-2010
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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 Ver Mensaje
No sé si es la manera estándar o si existiría una forma más directa , 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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #10  
Antiguo 04-08-2010
Thoronluin Thoronluin is offline
Miembro
 
Registrado: feb 2009
Posts: 39
Poder: 0
Thoronluin Va por buen camino
Buenas tardes delphi.com.ar:

Cita:
Empezado por delphi.com.ar Ver Mensaje
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 Ver Mensaje
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:56:33.


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
Copyright 1996-2007 Club Delphi