Estruturas de Dados 2019/2020 (CC1007) - DCC/FCUP

Aula Prática #07 - Listas, Pilhas e Filas
(semana de 30/03 a 03/04)


Conteúdos das teóricas

Nesta aula iremos continuar a usar listas ligadas, bem como Pilhas e Filas. Será por isso conveniente recordar o que foi dado nas teóricas:


Exercício 1) Listas Circulares

Nas teóricas falamos de mais tipos de listas ligadas, incluindo a noção de listas circulares, onde o último elemento "aponta" para o primeiro, de forma circular:

  1. Testando as listas circulares.
    Faça download do código dado nas teóricas:

    Compile o código e execute a classe TestCircularLinkedList para ver as listas circulares em funcionamento. Procure acompanhar cada uma das linhas de código e o seu efeito. Note em particular o que faz o método rotate() que "roda" os elementos, colocando o primeiro elemento no final da lista e avançado o segundo elemento para o início da fila:

  2. Resolvendo um problema.
    Use listas circulares para resolver e submeter o problema [ED006] Pim, Pam, Pum, disponível no Mooshak de EDados no "Volume 3 (Listas Ligadas)".

Exercício 2) Pilhas

Um TAD Pilha é uma sequência de elementos LIFO (Last-In-First-Out) onde temos duas operações para modificar o conteúdo:

  1. Testando a API das Pilhas.
    Faça download do código dado nas teóricas (o TAD Pilha é o interface MyStack - o nome é este para distinguir do próprio Java). A implementação dada usa listas duplamente ligadas, pelo que também precisas de as ir buscar

Exercício 3) Filas

Um TAD Fila é uma sequência de elementos FIFO (First-In-First-Out) onde temos duas operações para modificar o conteúdo:

  1. Testando a API das Filas.
    Faça download do código dado nas teóricas (o TAD Fila é o interface MyQueue - o nome é este para distinguir do próprio Java):

    Compile o código e execute a classe TestMyQueue para ver a pilha em funcionamento.
    Procure acompanhar cada uma das linhas de código e o seu efeito. Note em particular os métodos do TAD (basta ver o interface) e como criar a Pilha (a variável do tipo do interface atribuída a uma implementação desse mesmo interface).

  2. Um primeiro problema com filas
    Resolva e submeta o problema [ED196] Duas filas, disponível no Mooshak de EDados no "Volume 4 (Pilhas e Filas)".
  3. Uniao ordenada
    Resolve e submeta o problema [ED197] União Ordenada, disponível no Mooshak de EDados no "Volume 4 (Pilhas e Filas)".

Exercícios extra para consolidação de conhecimentos

  1. Mais problemas de pilhas e filas
    Tem disponíveis no Mooshak de EDados, no "Volume 4 (Pilhas e Filas)", mais alguns problemas envolvendo pilhas e filas. Estes são problemas mais "completos", com várias camadas, onde a representação mais natural dos dados é precisamente uma pilha ou uma fila:
  2. Listas Duplamente Ligadas
    Espreite as classes de listas duplamente ligadas, teste-as e implemente nelas os métodos que fez na aula anterior para listas simples (problemas 188 a 193), fazendo as devidas alterações.

Exercício de Desafio

Para esta semana o desafio tem a ver com a eficiência algorítmica. Deve tentar resolver o seguinte problema, que está disponível para submissão no Mooshak (enunciado em inglês):

Este problema é semelhante ao [ED006] Pim, Pam, Pum, mas com uma grande diferença que o torna (muito) mais complicado: o tamanho do círculo com pessoas a eliminar chega a 10 milhões, pelo que uma solução "bruta", que simule todos os passos, não irá ser suficientemente eficiente (passaria nos testes "pequenos", mas excederia o limite de tempo nos testes "grandes").

A Maratona Inter-Universitária de Programação (MIUP) é um concurso de programação universitário. A edição deste problema, a de 2015, foi ganha por uma equipa de alunos do DCC. A edição deste ano (2020) será em Outubro, no IST (Instituto Superior Técnico), em Lisboa.

Para este problema, vou apenas dizer que este estilo de "eliminação" é conhecida como Josephus problem. Se precisarem de mais dicas avisem. Fico à espera de ver os vossos programas :)