Vous êtes sur la page 1sur 22

Filas

em ingls Queues
pronuncia-se ku
Fac. Cincias Univ. Lisboa

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Hoje
!

Especificao da fila.

Ligao a uma classe Java.

Implementao vectorial.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Operaes de uma fila


!

Queremos especificar uma fila (FIFO First In First


Out) de elementos arbitrrios.

! Com as seguintes operaes:


! make: para construir uma fila vazia;

enqueue: para adicionar um elemento no fim da fila;


!
isEmpty: para verificar se a fila est vazia;
! front: para obter o elemento no princpio da fila; e
!
dequeue: para eliminar o elemento no princpio da fila.
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Especificao da Fila (Queue)


specification
sorts
Queue
constructors
make: > Queue;
enqueue: Queue Element > Queue;
observers
front: Queue >? Element;
dequeue: Queue >? Queue;
isEmpty: Queue;
domains
Q: Queue;
front(Q) if not isEmpty (Q);
dequeue(Q) if not isEmpty (Q);
axioms
Q: Queue ; E: Element ;
front(enqueue(Q, E)) = E when isEmpty(Q)
else front(Q);
dequeue(enqueue(Q, E)) = Q when isEmpty(Q)
else enqueue(dequeue(Q),E);
isEmpty (make ()) ;
not isEmpty (Queue(Q, E));
end specification"

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Construo da Especificao
!

Classificamos as 5 operaes nas 3 categorias


(constructors, observers, e others)

Comeamos por escrever as suas assinaturas:


!

para construir uma fila vazia:


! make: Queue;

para pr um elemento na fila precisamos de uma fila e


um elemento, obtemos uma nova fila que contm o
elemento adicionado (seja de tipo Element):
!

enqueue: Queue Element Queue;

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Construo da Especificao
! A operao isEmpty um predicado:
!
isEmpty: Queue;
! Para obter o elemento da frente da fila, precisamos de

uma fila, e obtemos um elemento:


! front: Queue Element;

Finalmente para remover um elemento de uma fila,


precisamos de uma fila, e obtemos uma fila
!

dequeue: Queue Queue;

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Constructors
! Claro que nem isEmpty nem front, j que no retornam

nenhuma Queue.
! A pergunta seguinte :
!
!
!

Das 3 operaes que sobram, so TODAS absolutamente


necessrias para construir QUALQUER fila imaginvel?
Suponhamos a fila Q que se obtm de Q atravs da operao
dequeue. Podemos obter Q de outra forma?
SIM: bastaria nunca ter adicionado o elemento retirado pelo
dequeue

Ento, os constructors so make e enqueue.


Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Classificao das restantes ops.


!

isEmpty, front e dequeue vo para observers e others

podemos definir algum deles apenas em termos dos


outros dois? NO

ento colocamos todos em observers

! e others fica vazio.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Prximo passo: Domains


!

Ateno s funes que no e4sto definidas para


valores arbitrrios dos parmetros

S h problemas com o elemento da frente de uma fila


vazia, logo usamos o smbolo de funo parcial ?
! front(Q) if not isEmpty(Q);#
!

dequeue(Q) if not isEmpty(Q);#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Axioms
! O passo final, e o mais importante.
!

Primeiro: observers vs. constructors (ou seja, observar o


resultado de aplicar um constructor). So 2 x 3
axiomas, menos 2, porque front e dequeue no se
podem aplicar a filas vazias:

Obviamente:
isEmpty (make());#
! not isEmpty (enqueue (Q, E));#
!

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mais Axioms
! Como no podemos observar o front de uma queue

obtida com make, concentramo-nos das queues obtidas


com enqueue
!

Ento, juntmos um elemento E no fim da fila Q, e


agora estamos a perguntar qual o elemento no princpio.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mais Axioms
!

O caso simples quando a fila tem um s elemento, E, esse o


do princpio
!
!

Ter um s elemento quer dizer que estava vazia antes da sua


insero, ou seja, estava isEmpty(Q).
Fica
! front (enqueue (Q, E)) = E if isEmpty(Q);#

E quando Q no est vazia, pedimos a frente da velha fila Q:


! front (enqueue (Q, E)) =

#front (Q) if not isEmpty(Q);#

Combinando os dois:
!

front(enqueue(Q, E)) =
E when isEmpty(Q)
else front(Q);#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mais axiomas:
! Para relacionar dequeue com enqueue
! O lado esquerdo ser dequeue(enqueue(Q, E))
!

Fcil quando Q est vazia: retirar um elemento aps


adicion-lo d a fila Q"

Quando Q no est vazia temos que fazer dequeue. Mas


repare-se que temos que fazer dequeue de enqueue(Q) e no
de Q.

! Logo temos que colocar E de volta no resultado de

dequeue(Q)#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Axioma para dequeue


!

Fica:
!

dequeue (enqueue(Q, E)) =


Q when isEmpty(Q)
else enqueue (dequeue (Q), E);#

Exemplo:

Esta Q

d c b a

Esta enqueue(Q,e) e d c b a
E esta
dequeue(enqueue(Q,e)) e d c b

Novamente Q

d c b a

dequeue(Q) d c b
enqueue(dequeue(Q),e) e d c b

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Especificao de Element#
!

Fica como antes, sem qualquer restrio:

! specification

sorts
Element
end specification#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Refinement do Queue
!

Usamos
!
!

Object para Element


VectorialQueue para Queue

! refinement

Element is class Object


Queue is class VectorialQueue {
make: Queue is VectorialQueue();
enqueue: Queue e: Element Queue is
void offer(Object e);
front: Queue ? Element is Object element();
dequeue: Queue ? Queue is void remove();
}
end refinement#
Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

implementao
! A classe LinkedList implementa a interface Queue#
!

Exemplo:
! Queue<String> names = new LinkedList<String>();#

! Como names do tipo Queue<String> s se podem aplicar

mtodos da interface Queue.


!

Outra implementao com DoubleLinkedList#

Ainda outra com CircularArray#

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Implementao vectorial

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

constructors

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mtodos pblicos

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Mtodos auxiliares

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Classe Adaptadora
! Chama-se adapter class a uma classe que implementa

uma interface essencialmente renomeando os mtodos


de uma outra classe.
!

Por exemplo no ListStack, usar push em vez de


add.

Isto um exemplo de reutilizao de cdigo para


fazer herana por delegao.

Luis Antunes
Algoritmos e Estruturas de Dados 2010-2011

Fac. Cincias
Univ. Lisboa

Vous aimerez peut-être aussi