Exercícios de Listas Simplesmente Encadeadas, Duplamente Encadeadas e Recursividade 1) Implemente uma lista ligada de produtos. Cada produto possui um código, descrição, preço de venda e preço unitário. Na lista ligada devem ser implementados os métodos: construtor, adicionaFinal, adicionaInicio, adiciona(em posição específica), removeFinal, removeInicio, remove (em posição específica) e mostra (mostra todos os elementos). 2) Implemente uma fila, com alocação dinâmica de memória, para produtos. Cada produto possui um código, descrição, preço de venda e preço unitário. Na fila devem ser implementados os métodos: construtor, adiciona, remove e mostra (mostra todos os elementos). 3) Implemente uma pilha, com alocação dinâmica de memória, para produtos. Cada produto possui um código, descrição, preço de venda e preço unitário. Na pilha devem ser implementados os métodos: construtor, empilha, desempilha e mostra (mostra todos os elementos). 4) Na Pilha com alocação dinâmica de memória, com encadeamento simples, o topo é no início ou no final da estrutura de dados? Qual é o motivo dessa implementação? 5) Simule passo-a-passo no papel as instruções a seguir considerando uma pilha p1 e uma fila f1, ambas com alocação dinâmica de memória. a) f1.adiciona(71); b) f1.adiciona(72); c) f1.adiciona(73); d) f1.adiciona(74); e) x=f1.remove(); f) p1.empilha(x); g) x=f1.remove(); h) p1.empilha(x); i) x=f1.remove(); j) p1.empilha(x); k) x=p1.desempilha(); l) f1.adiciona(x); m) x=p1.desempilha(); n) f1.adiciona(x); o) x=p1.desempilha(); p) f1.adiciona(x); 6) Mostre as passagens necessárias para ordenar a sequência: 45 64 32 70 51 12 69 aplicando MergeSort 7) Mostre as passagens necessárias para ordenar a sequência 45 64 32 70 51 12 69 aplicando QuickSort 8) Modifique o método mergeSortRecursivo para classificar em ordem inversa os elementos. 9) Modifique o método quickSort para classificar em ordem inversa os elementos. 10) Modifique o método quickSort para utilizar como pivô o último elemento da subdivisão. 11) Considere o método: int X(int a) { if ( a <= 0 ) return 0; else return a + X(a-1); } Simule e mostre a pilha de instruções. 12) Vários algoritmos em computação usam a técnica de “Dividir para Conquistar”: basicamente eles fazem alguma operação sobre todos os dados, e depois dividem o problema em sub-problemas menores, repetindo a operação. Uma equação de recorrência típica para esse tipo de algoritmo é mostrada abaixo. Implemente um método Java com essa equação de recorrência. T(n) = 2T(n/2) + n; T(1) = 1; 13) O máximo divisor comum (MDC) de dois números inteiros x e y pode ser calculado usando-se uma definição recursiva: MDC(x,y) = MDC (x-y,y), se x>y. E: MDC(x,y)=MDC(y,x) MDC(x,x)=x Implemente um método Java com essa recorrência. 14) Implemente em Java uma lista duplamente encadeada que possui dois atributos, o primeiro é uma referência para o primeiro nó, e outro, uma referência para o último nó. O tipo do dado é inteiro. Faça as alterações necessárias nos métodos adicionaInicio, adicionaFinal, removeInicio e removeFinal. Implemente dois métodos para percorrer a lista mostrando os elementos, um percorre do início para o fim, e outro, do final para o início. Implemente um método que calcula e retorna a média dos elementos da lista. 15) Implemente em Java uma lista duplamente encadeada que possui dois atributos, o primeiro é uma referência para o primeiro nó, e outro, uma referência para o último nó. O tipo do dado é String. Faça as alterações necessárias nos métodos adicionaInicio, adicionaFinal, removeInicio e removeFinal. Implemente dois métodos para percorrer a lista mostrando os elementos, um percorre do início para o fim, e outro, do final para o início. Escreva um método que recebe por parâmetro uma String. No método a lista será percorrida do início para o final, se a String começar com letras de a até l, buscando a String. A lista será percorrida do final para o início, se a String começar com letra a partir de m, buscando a String. Se a String for encontrada, o método retorna true, e caso contrário, false. 16) Implemente em Java uma Fila Circular com alocação dinâmica de memória. 17) Utilizando as classes Fila e Pilha, tanto com alocação dinâmica quanto estática de memória, implemente em Java um método que recebe por parâmetro uma pilha, inverte seus elementos e retorna a Pilha invertida.