programação ii
Post on 02-Jan-2016
24 Views
Preview:
DESCRIPTION
TRANSCRIPT
Programação II
Prof. Mateus Raeder
Universidade do Vale do Rio dos Sinos- São Leopoldo -
Programação II – Prof. Mateus Raeder
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 circularpublic 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
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!
0,5 na prova do Grau A
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
top related