1 / 31

Programação II

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

Download Presentation

Programação II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos- São Leopoldo -

  2. 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

  3. Fila (Queue) Programação II – Prof. Mateus Raeder

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. Fila Circular (Circular Queue) Programação II – Prof. Mateus Raeder

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. Fila circular public int getFirst() throws UnderflowException{ if (isEmpty()) throw new UnderflowException(); return queue[first]; } Programação II – Prof. Mateus Raeder

  25. 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

  26. 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

  27. 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

  28. Deque (Deque – Double Ended Queue) Programação II – Prof. Mateus Raeder

  29. 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

  30. 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

  31. 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

More Related