Pilhas, Filas e Listas (Parte I )

cubos.gifNeste tutorial faremos um apanhando geral e montaremos um exemplo prático do uso de pilhas, listas e filas. O exemplo será baseado no código de Fernando Cesar Brito encontrado em seu artigo sobre Pilha (Stack). O exemplo dele foi estendido para uso de filas e listas. Na parte final (III) disponibilizaremos aplicativo completo usando os exemplos do tutorial.

Classes

O Object Pascal tem na manga algumas classes úteis mas que são pouco usadas. É o caso destas três : TObjectStack, TObjectList e TObjectQueue.

Estas classes funcionam basicamente como containers de objetos. Um ‘container’ é um objeto que armazena outros objetos e disponibiliza métodos de acesso a seus elementos. O que diferencia as classes acima mencionadas é que cada uma manipula objetos usando métodos com lógicas diferentes.

Esta primeira parte tratará da TObjectStack (Pilha de Objetos).

Pilhas

Imagine que esteja limpando sua famosa estante com bíblias de todas as linguagens de programação. A limpeza exige que tire um livro, tire o pó e coloque em cima do último. Pense que está fazendo assim para permitir colocar os livros de volta à estante sem perder a ordem original. Será preciso então pegar o de cima, o último a ser limpo, e colocá-lo em seu lugar. Imaginando esta situação entenderá o conceito de pilha.

Para criar uma pilha de objetos, usaremos a classe TObjectStack.

Métodos

Os métodos principais são :

  • PUSH – Coloca objeto na pilha.
  • PEEK – Retorna o último objeto sem tirá-lo da pilha.
  • POP – Tira o último objeto da pilha.
  • COUNT – Conta quantos objetos estão armazenados.
  • CLEAR – Limpa a pilha, excluindo todos os objetos

Modo de Usar

Os métodos podem ser utilizados nesta sequência:

  • - Crie o objeto TObjectStack
  • - Adicione um objeto usando push()
  • - Manipule o objeto usando peek()
  • - Retire o objeto da lista usando pop();
  • - Destrua o pilha usando free();

Importante:

Estes procedimentos evitarão vazamentos de memória em sua aplicação.

O programador deve criar e destruir os objetos passados.
A pilha não libera a memória usada pelos objetos retirados.
Sempre libere a memória alocada pelos elementos.
Antes de encerrar a aplicação, remova e destrua todos o conteúdo.

Exemplo de código

procedure TForm1.ExemploPilha;
var
   Pessoa : TPessoa;
   Pilha : TObjectStack;
begin

   // cria objetos e pilha.
   Pilha := TObjectStack.Create;
   Pessoa := TPessoa.Create;
   Pessoa.Nome := 'Wanc';
   // adiciona objeto pessoa á pilha
   Pilha.Push(pessoa);

   // Mostra quantos objetos estão armazenados.
   ShowMessage('Pessoas :' +
                IntToStr(pilha.Count));

   // Obtém o objeto pessoa sem tirá-lo da lista.
   Pessoa := TPessoa(pilha.Peek);

   // Mostra propriedade do objeto armazenado.
   ShowMessage ('Nome da pessoa '+ pessoa.Nome);

   //retira o objeto da pilha (não tira da memória)
   Pessoa := TPessoa(Pilha.Pop);

   // Libera memória
   Pessoa.Free;
   Pilha.Free;

end;

Onde uso isto?

Onde precisar de uma lista com elementos na ordem reversa.
Num programa de locadora, por exemplo, poderá gerar a lista dos 10 últimos filmes alugados.
Outros usos possíveis:

  • Armazenar lista de ações efetuadas, permitindo opção ‘Voltar’
  • Jogos de cartas
  • Máquinas de Status
  • Armazenamento de resultados parciais
  • Inversão de listas

Copie o código, modifique e aprenda como usar aplicando nos seus projetos. Não esqueça de consultar o Help do Delphi ou o site da CodeGear se tiver alguma dúvida ou quiser se aprofundar mais no assunto.

Abraços, e até a próxima!

Deixe uma resposta