310 likes | 403 Views
Programação II. Prof. Mateus Raeder. Universidade do Vale do Rio dos Sinos - São Leopoldo -. Listas especiais. O armazenamento sequencial (estático) é útil quando as estruturas sofrem poucas remoções ou inserções, ou quando estas não acarretam grandes movimentações de nós
E N D
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos- São Leopoldo -
Listas especiais • O armazenamento sequencial (estático) é útil quando as estruturas sofrem poucas remoções ou inserções, ou quando estas não acarretam grandes movimentações de nós • Não é exatamente o caso de listas que permitem inserção em qualquer posição • O armazenamento sequencial é mais utilizado para implementas tipos especiais de listas: • Filas (Queue em inglês) • Pilhas (Stack em inglês) • Deques (Deque em inglês) Programação II – Prof. Mateus Raeder
Fila (Queue) Programação II – Prof. Mateus Raeder
Filas • Elementos são inseridos no final da fila e retirados do início da fila • Geralmente a implementação contém 2 ponteiros (variáveis): • first: para o início da fila • last: para o fim da fila • FIFO (First-In, First-Out) • Primeiro a entrar, primeiro a sair • Fila vazia: quando last for igual a first-1 Programação II – Prof. Mateus Raeder
Filas • Suponhamos uma fila de números inteiros F que, em certo momento, possui os seguintes 7 elementos: 1 6 9 -3 0 3 5 • Declarando um array de inteiros de nome F com MAX=10 elementos (F[0..MAX-1]), teremos a seguinte fila: 1 6 9 -3 0 3 5 Programação II – Prof. Mateus Raeder
Exercício: Filas • Dada a fila acima, realize as operações abaixo (cumulativamente) e desenhe a pilha resultante em cada passo: • Inserir 10 • Retirar o primeiro elemento • Retirar o primeiro elemento • Inserir 2 • Retirar o primeiro elemento 2 8 4 1 Programação II – Prof. Mateus Raeder
Operações sobre filas • public boolean isEmpty( ) • verifica se a fila está vazia • public boolean isFull( ) • verifica se a fila está cheia • public boolean enqueue( int element ) • insere o elemento no final da fila Programação II – Prof. Mateus Raeder
Operações sobre filas • public int dequeue( ) • remove e retorna o primeiro elemento da fila • public int getFirst( ) • retorna o primeiro elemento da fila, sem removê-lo • public void print( ) • exibe o conteúdo da fila Programação II – Prof. Mateus Raeder
Filas • Supondo a existência da classe Queue, desenhe a fila criada através do código abaixo (a saída do programa): public static void main(String args[]){ Queue f = new Queue(5); f.enqueue(4); f.enqueue(7); f.enqueue(14); f.dequeue(); f.enqueue(3); f.dequeue(); f.dequeue(); f.print(); } Programação II – Prof. Mateus Raeder
Filas public class Queue { protected int first = 0, last = -1; protected int q[]; public Queue(int size) { q = new int[size]; } ... //demais métodos } Programação II – Prof. Mateus Raeder
Filas • Verificar se está vazia ou se está cheia • Vazia: public boolean isEmpty() { if (last == (first-1)) return true; return false; } Programação II – Prof. Mateus Raeder
Filas • Verificar se está vazia ou se está cheia • Cheia: public boolean isFull() { if (last == (q.length-1)) return true; return false; } Programação II – Prof. Mateus Raeder
Filas • Inserção e remoção de elementos • Inserção (enqueue): public boolean enqueue (int element) { if (isFull()) return false; last++; q[last] = element; return true; } Programação II – Prof. Mateus Raeder
Filas • Inserção e remoção de elementos • Remoção (dequeue): public int dequeue() { if (isEmpty()){ System.out.println(“ERRO”); return 0; } int element = q[first]; first++; return element; } Programação II – Prof. Mateus Raeder
Filas • Retornar o primeiro elemento sem remover public int getFirst(){ if (isEmpty()) { System.out.println(“ERRO”); return 0; } return q[first]; } Programação II – Prof. Mateus Raeder
Filas • Imprimir os elementos da fila public void print() { for (int i = first; i <= last; i++) System.out.print(q[i] + ", "); System.out.println(); } Programação II – Prof. Mateus Raeder
Fila Circular (Circular Queue) Programação II – Prof. Mateus Raeder
Fila circular • Observamos que uma fila pode ser considerada como cheia mesmo não contendo nenhum elemento • Isto acontece pela maneira com a qual lidamos com os índices de início e de final da fila • Uma solução é trabalhar com filas circulares Programação II – Prof. Mateus Raeder
Fila circular public class CircularQueue { private int[] queue; private int first = -1, last = -1; public CircularQueue (int length) { queue = new int[length]; } ...//demais métodos Programação II – Prof. Mateus Raeder
Fila circular public boolean isFull() { if ((first == 0 && last == queue.length – 1) || (first == last + 1)) return true; else return false; } ...//demais métodos Programação II – Prof. Mateus Raeder
Fila circular ...//demais métodos public boolean isEmpty() { if (first == -1) return true; else return false; } ...//demais métodos Programação II – Prof. Mateus Raeder
Fila circular public void enqueue (int element) throws OverflowException{ if(isFull()) throw new OverflowException(); //caso a fila esteja vazia ou o last esteja //na última posição (neste caso a fila torna-se //circular), inserimos na primeira posição if(last == queue.length-1 || last == -1){ last = 0; queue[last] = element; //se a fila está vazia, vamos inserir o primeiro nó if(first == -1) first = 0; } else{ last++; queue[last] = element; } } Programação II – Prof. Mateus Raeder
Fila circular public int dequeue() throws UnderflowException{ if (isEmpty()) throw new UnderflowException(); int element = queue[first]; //se a fila tem somente 1 elemento if (first == last) first = last = -1; //se a fila está circular e deve-se //remover a última posição do array else if (first == queue.length - 1) first = 0; else first++; return element; } Programação II – Prof. Mateus Raeder
Fila circular public int getFirst() throws UnderflowException{ if (isEmpty()) throw new UnderflowException(); return queue[first]; } Programação II – Prof. Mateus Raeder
Fila circular public static void main(String args[]) { CircularQueue f = new CircularQueue(5); try { f.enqueue(1); f.enqueue(2); f.enqueue(3); f.enqueue(4); } catch (OverflowException e) { System.out.println(e.toString()); } try { f.dequeue(); f.dequeue(); } catch (UnderflowException e) { System.out.println(e.toString()); } try { f.enqueue(5); f.enqueue(6); f.enqueue(7); f.enqueue(8); } catch (OverflowException e) { System.out.println(e.toString()); } } Programação II – Prof. Mateus Raeder
0,5 na prova do Grau A Exercícios: fila circular • Implemente métodos para exibir o conteúdo de uma fila circular de 2 maneiras: • No método main, faça o código necessário para que, enquanto a fila não estiver vazia, esvazie a fila, exibindo os elementos retirados • Crie um método print() na classe CircularQueue que exiba o conteúdo da fila na ordem em que foram inseridos! Programação II – Prof. Mateus Raeder
Resposta (método print) public void print (){ if(!isEmpty()){ if(first < last){ for(int i=first; i<=last; i++) System.out.print(queue[i]+”, ”); } else{ for(int i=first; i<queue.length; i++) System.out.print(queue[i]+”, ”); for(int i=0; i<=last; i++) System.out.print(queue[i]+”, ”); } System.out.println(); } } Programação II – Prof. Mateus Raeder
Deque (Deque – Double Ended Queue) Programação II – Prof. Mateus Raeder
Deque • O deque é um tipo de fila em que as inserções e remoções podem ser realizadas em ambas as extremidades, que chamaremos de frente (front) e final (back) Programação II – Prof. Mateus Raeder
Operações sobre deques • public boolean isEmpty() • verifica se o deque está vazio • public boolean isFull( ) • verifica se o deque está cheio • public boolean enqueueFront( int element ) • insere o elemento na cabeça do deque • public boolean enqueueBack( int element ) • insere o elemento no final do deque Programação II – Prof. Mateus Raeder
Operações sobre deques • public int dequeueFront() • remove e retorna o primeiro elemento do deque • public int dequeueBack() • remove e retorna o último elemento do deque • public int getFirst() • retorna o primeiro elemento do deque, sem removê-lo • public int getLast() • retorna o último elemento do deque, sem removê-lo • public void print() • exibe o conteúdo do deque Programação II – Prof. Mateus Raeder