Você está na página 1de 4

PROBLEMAS TRIVIAIS

Recursividade
Fatorial: Escreva uma função recursiva que calcule o fatorial de um número N.

Fibonacci: Implemente uma função recursiva que retorne o N-ésimo termo da sequência de
Fibonacci. Teste a função com valores de N pequenos e grandes e observe a performance.

Torres de Hanói: Escreva uma função recursiva que resolva o problema das Torres de Hanói.
A função deve imprimir os movimentos necessários para mover N discos do pino A para o
pino C, usando o pino B como auxiliar.

Soma de Elementos de uma Lista: Escreva uma função recursiva que calcule a soma de
todos os elementos de uma lista.

Permutações de String: Implemente uma função recursiva que gere todas as permutações
possíveis de uma string e as retorne em uma lista.

Subconjuntos de um Conjunto: Desenvolva uma função recursiva que gere todos os


subconjuntos possíveis de um conjunto dado.

Listas
Implementação de Lista: Crie uma classe Lista que implemente as seguintes operações
básicas: inserção, remoção e busca de um elemento. Além disso, adicione um método para
imprimir todos os elementos da lista.

Reversão de Lista: Escreva uma função que receba uma lista e reverta a ordem de seus
elementos, sem criar uma nova lista.

Intercalar Listas: Escreva uma função que receba duas listas e as intercale em uma única
lista. Não utilize métodos prontos da linguagem e faça a intercalação elemento a elemento.

Remoção de Duplicatas: Implemente uma função que remova todos os elementos duplicados
de uma lista.

Pilhas
Validação de Símbolos: Implemente uma função que use uma pilha para verificar se uma
expressão contém parênteses, colchetes e chaves abertos e fechados corretamente. Exemplo
de entrada: {[()]}, saída esperada: True; entrada: {[(])}, saída esperada: False.

Conversão de Decimal para Binário: Utilize uma pilha para converter um número inteiro
decimal para binário. Apresente o resultado como uma string.
Mínimo na Pilha: Modifique a estrutura de Pilha para que ela suporte uma operação
adicional min(), que retorna o menor elemento presente na pilha em tempo constante.

Validação de Sequência de Empilhamento: Dada uma sequência inicial de números (1 a n) e


uma sequência-alvo, verifique se a sequência-alvo pode ser alcançada através de uma série de
operações de empilhar e desempilhar.

Filas
Simulação de Fila de Banco: Implemente uma classe FilaDeBanco que simule a chegada e o
atendimento de clientes. Utilize métodos para inserir clientes na fila, atender clientes e
mostrar o estado atual da fila.

Rodízio de Pessoas: Dada uma fila inicial de pessoas, crie uma função que simule um
número n de operações de "passar a pessoa da frente para o final da fila". Ao final, mostre a
nova configuração da fila.

Reverso de Fila: Utilizando apenas operações de fila (enfileirar e desenfileirar), escreva uma
função que inverta a ordem dos elementos de uma fila.

Distribuição de Chamadas: Imagine um sistema de distribuição de chamadas para


atendentes. Implemente uma função que, dadas duas filas (uma de chamadas e outra de
atendentes), distribua as chamadas de forma equitativa, retornando a fila de chamadas não
atendidas (se houver).

PROBLEMAS FORMULADOS

Problema 1: Sistema de Gerenciamento de Tarefas de Impressão

Contexto:
Em uma pequena empresa, há apenas uma impressora disponível para todas as tarefas de
impressão. Devido à alta demanda, foi decidido implementar um sistema de gerenciamento
para organizar as tarefas de impressão de acordo com a urgência e a ordem de chegada. O
sistema deve atender aos seguintes requisitos:

Adicionar Tarefa de Impressão:


Cada nova tarefa de impressão é adicionada ao sistema com um identificador único e um
nível de urgência (baixo, médio, alto).
Processar Tarefa de Impressão:
A impressora deve priorizar tarefas de alta urgência sobre as demais. Entre tarefas de igual
urgência, a que foi adicionada primeiro deve ser impressa antes (FIFO - First In, First Out).
Entretanto, uma vez que uma tarefa de impressão começa, ela deve ser concluída antes de
qualquer outra ser iniciada.

Cancelar Tarefa de Impressão:


Em casos raros, uma tarefa de impressão pode ser cancelada enquanto ainda está na fila. O
sistema deve ser capaz de remover uma tarefa específica, independentemente da sua posição
na fila.

Desafio:
Desenvolva um sistema em que utilize tanto a estrutura de dados Pilha quanto Fila para
gerenciar as tarefas de impressão, conforme os requisitos acima. Considere utilizar a Fila para
organizar as tarefas por ordem de chegada e a Pilha para talvez auxiliar no processo de
cancelamento de uma tarefa específica, demonstrando compreensão sobre como e quando
usar cada uma dessas estruturas.

Problema 2: Gerenciador de Atendimento ao Cliente


Contexto:
Uma empresa deseja melhorar seu sistema de atendimento ao cliente introduzindo um novo
recurso de gerenciamento de solicitações. Esse recurso precisa organizar as solicitações de
clientes com base na ordem de chegada, mas também deve permitir que solicitações urgentes
sejam priorizadas. Além disso, o sistema deve ser capaz de lidar com operações de consulta,
como verificar a próxima solicitação a ser atendida e cancelar solicitações específicas, se
necessário.

Desafio:
Desenvolva um programa em que utilize tanto a estrutura de dados Fila quanto Pilha para
criar um sistema de gerenciamento de solicitações de atendimento ao cliente. Este sistema
deve atender aos seguintes requisitos:

● Adicionar Solicitação:
Cada nova solicitação possui um identificador único e um nível de urgência (normal
ou urgente). As solicitações normais entram na fila de atendimento padrão, enquanto
as solicitações urgentes são colocadas em uma fila de prioridade.

● Atender Solicitação:
O sistema deve atender primeiro às solicitações urgentes. Dentro de cada categoria
(urgente ou normal), as solicitações devem ser atendidas seguindo a ordem de
chegada.
● Cancelar Solicitação:
O sistema precisa permitir o cancelamento de uma solicitação, dado seu identificador.
Isso pode exigir a remoção de uma solicitação que não seja a próxima na fila de
atendimento.

● Consultar Próxima Solicitação:


Em qualquer momento, deve ser possível consultar qual será a próxima solicitação a
ser atendida, sem removê-la do sistema.

ORIENTAÇÕES ADICIONAIS

● Para os exercícios de implementação (Listas, Pilhas e Filas), primeiro planejem a


estrutura de dados, definindo quais operações são necessárias e como elas serão
realizadas.
● Nos exercícios de recursividade, é importante definir claramente a condição de parada
das funções recursivas para evitar loops infinitos.
● Sempre executem casos de teste para cada função ou método implementado, é
importante testar com diferentes entradas.

Estes exercícios foram pensados para fornecer uma boa base prática e teórica em estruturas
de dados fundamentais, incentivando o pensamento crítico e a resolução de problemas.

Você também pode gostar