6. Implementação de Fila É uma lista onde a inserção é realizada em uma extremidade e a retirada na outra. Critério “FIFO” First In First Out (primeiro que entra, primeiro que sai) 6.1. Principais Operações • Insere (enqueue) • Retira (dequeue) • estaCheia • estaVazia • consulta 6.2. Representação por contigüidade física v: vetor de nodos frente: índice do nodo que está no início da fila ré: índice do nodo que está no fim da fila Condição Inicial: Torna a inclusão do primeiro nodo igual as demais Inserir na Fila f.insere(10) Quando Frente=Ré a fila possui 1 nodo 28 f.insere(20) f.insere(30) Retirar X=f.retira() Como verificar se a fila está vazia? Ré < Frente Como verificar se a fila está cheia? v.length -1 (capacidade do vetor) Observação: Nesta implementação não há reaproveitamento de espaço já ocupado. Existe uma situação em que a fila torna-se cheia e vazia ao mesmo tempo? X=f.retira() Ré < Frente: Fila vazia Ré = v.length: Fila cheia 29 Como melhorar a implementação? 1) Deslocando os nodos para o início do vetor a cada retirada. 2) Deslocando os nodos para o início do vetor na situação de lista cheia Fila CHEIA f.insere(24) 3) Implementando um fila circular. 6.3. Fila Circular O último elemento é considerado adjacente ao primeiro. Como verificar se a fila está vazia? tam=0 Como verificar se a fila está cheia? tam=v.length 30 6.4. Implementando uma Fila com LinkedList Existe uma interface que define a estrutura de dados Fila. Essa interface chama-se Queue, umas das classes que implementam Queue é a LinkedList. Exemplo: import java.util.LinkedList; import java.util.Queue; public class ExemploFila { public static void main(String[] args) { Queue fila = new LinkedList(); Aluno a1 = new Aluno(1000,"Ana"); Aluno a2 = new Aluno(1001,"Beatriz"); Aluno a3 = new Aluno(1002,"Carlos"); fila.offer(a1); fila.offer(a2); fila.offer(a3); fila.poll(); if(fila.isEmpty()){ System.out.println("A fila está vazia"); }else { System.out.println(fila); } } } 6.5. Implementando uma Fila de prioridade com PriorityQueue Fila de prioridade é uma “fila” onde os nodos são retirados em uma ordem determinada. Ascendente: Apenas o menor elemento pode ser removido. Descendente: Apenas o maior elemento pode ser removido. X= f.retira() 31 Classe PriorityQueue Método PriorityQueue() Cria uma fila de prioridade com capacidade inicial de 11 nodos. public boolean add (Object obj) Adiciona um nodo na fila. Retorna true. Exceções: NullPointerExeception – se o elemento é null ClassCastExeception – se o elemento não pode ser comparado com os elementos que estão na fila. public Object poll() Consulta e remove um nodo da fila. Retorna null se a fila está vazia Exemplo import java.util.PriorityQueue; public class Exemplo11{ public static void main(String args[]){ PriorityQueue fila = new PriorityQueue(); Integer dado; fila.add(new Integer(40)); fila.add(new Integer(10)); fila.add(new Integer(60)); System.out.println(fila); dado = (Integer) fila.poll(); while(dado!=null){ System.out.println(dado); dado = (Integer) fila.poll(); } } } 32