Você está na página 1de 4

Pós-Graduação em Ciência da Computação Universidade Federal de São Paulo - São José dos Campos

Exercı́cios sobre Pilhas, Filas e Listas


AAED — Análise de Algoritmos e Estruturas de Dados
Prof. Jurandy G. Almeida Jr.
2 o Semestre de 2021

Exercı́cios
1. Se você tiver que escolher entre uma representação de lista por arranjos e uma representação
de lista usando apontadores, quais informações são necessárias para você selecionar uma
representação apropriada? Como esses fatores influenciam a escolha da representação?
2. Se uma fila representada por arranjos não é considerada circular, sugere-se que cada operação
TFila Desenfileira deve deslocar para F rente todos os elementos restantes da fila. Um
método alternativo é adiar o deslocamento até que T ras seja igual ao último ı́ndice do vetor.
Quando essa situação ocorre e faz-se uma tentativa de inserir um novo elemento na fila, a fila
inteira é deslocada para F rente, de modo que o primeiro elemento da fila fique na primeira
posição do vetor. Quais são as vantagens e desvantagens desse método?
3. Utilizando a implementação de listas por arranjos, implemente um procedimento para inserir
um item em uma determinada posição da lista. Qual é a ordem de complexidade do seu
procedimento?
4. Um problema que surge com frequência na manipulação de listas lineares implementadas
através de apontadores é “andar para trás” na lista, ou seja, percorrê-la no sentido inverso
dos apontadores. Uma solução para isso é implementar uma lista duplamente encadeada,
em que cada célula também possui um apontador para a sua antecessora, como mostrado na
figura abaixo:

(a) Declare os tipos necessários para a implementação dessa lista.


(b) Escreva um procedimento para retirar uma célula apontada por um apontador p.
(c) Escreva um procedimento para inserir um elemento na primeira posição da lista (logo
após a célula cabeça).

5. Considere uma pilha P vazia e uma fila F não vazia. Utilizando apenas os testes de fila
e pilha vazias, as operações TFila Enfileira, TFila Desenfileira, TPilha Empilha,
TPilha Desempilha, e uma variável aux do tipo TItem, escreva um procedimento que
inverte a ordem dos elementos da fila.
6. Considere a implementação de listas encadeadas utilizando apontadores vista em sala. Escreva
um procedimento Troca(TLista *pLista, TApontador *p) que, dado um apontador para
uma célula qualquer (p), troca de posição essa célula com a sua célula seguinte da lista, como
mostrado na figura abaixo. (Obs. Não vale trocar apenas o campo Item! Você deverá fazer a
manipulação dos apontadores para trocar as duas células de posição). Não esqueça de tratar
os casos especiais.

7. Utilizando as operações de manipulação de pilhas vistas em sala, uma pilha auxiliar e uma
variável do tipo TItem, escreva um procedimento que remove um item com chave c de uma
posição qualquer de uma pilha. Note que você não tem acesso à estrutura interna da pilha
(T opo, Item, etc), apenas às operações de manipulação.

8. Escreva dois procedimentos (um usando a implementação por arranjos e outro usando a
implementação por apontadores) para remover de uma lista encadeada um elemento com
uma chave especı́fica (passada como parâmetro): Remove(TLista *pLista, TChave c).
Qual é a ordem de complexidade dos seus procedimentos?

9. Considere a implementação de filas usando arranjos “circulares”. Escreva um procedimento


FuraFila(TFila *pF ila, TItem x) que insere um item na primeira posição da fila. O
detalhe é que seu procedimento deve ser O(1), ou seja, não pode movimentar os outros itens
da fila.

10. Explique como implementar duas pillhas em um único vetor de tamanho n, de tal modo
que nenhuma das pilhas sofra estouro positivo (rejeite uma nova inserção por estar lotada),
a menos que o número total de elementos em ambas as pilhas juntas seja n. As operações
TPilha Empilha e TPilha Desempilha devem ser executadas no tempo O(1).

11. Enquanto uma pilha permite a inserção e a eliminação de elementos em apenas uma extremi-
dade e uma fila permite a inserção em uma extremidade e a eliminação na outra extremidade,
uma deque (double-ended queue, ou fila de extremidade dupla) permite a inserção e a eli-
minação em ambas as extremidades. Escreva quatro procedimentos de tempo O(1) para
inserir elementos e eliminar elementos de ambas as extremidades de uma deque construı́da
a partir de um vetor.
12. Mostre como implementar uma fila usando duas pilhas. Analise o tempo de execução das
operações sobre as filas.

13. Mostre como implementar uma pilha usando duas filas. Analise o tempo de execução das
operações sobre pilhas.

14. Implemente uma pilha usando uma lista encadeada simples. As operações TPilha Empilha
e TPilha Desempilha devem demorar o tempo O(1).

15. Implemente uma fila usando uma lista encadeada simples. As operações TFila Enfileira
e TFila Desenfileira devem demorar o tempo O(1).

16. Forneça um procedimento não recursivo de tempo Θ(n) que inverta uma lista simplesmente
encadeada de n elementos. Qualquer consumo de memória além do espaço de armazenamento
necessário para a própria lista deve ter tamanho O(1).

17. Explique como implementar listas encadeadas simples usando apenas um apontador N P por
item, em lugar dos dois apontadores usuais (P roximo e Anterior). Suponha que todos
os apontadores possam ser interpretados como inteiros de k bits e defina N P como N P =
P roximo XOR Anterior, o “ou exclusivo” de k bits de P roximo e Anterior. (O valor NULL
é representado por 0). Certifique-se de descrever as informações necessárias para obter acesso
ao inı́cio da lista. Mostre como implementar operações para inserir, remover e recuperar
elementos nesta lista. Mostre também como inverter a ordem dos elementos nesta lista em
tempo O(1).

18. Considere um conjunto armazenado em uma lista encadeada simples. Escreva uma função
para cada uma das operações abaixo:

(a) Pertence(A, x) que verifica se x pertence ou não ao conjunto dado por A.


(b) União(A, B) que recebe dois conjuntos, apontados por A e por B, e devolve a união
deles, ou seja, um apontador para uma lista simplesmente encadeada que representa a
união dos dois conjuntos. Os dois conjuntos devem ser mantidos intactos. Note que cada
elemento do conjunto deve aparecer na lista uma única vez.
(c) Intersecção(A, B) que recebe dois conjuntos, apontados por A e por B, e devolve (a
lista que representa) a intersecção entre eles. Novamente os dois conjuntos devem ser
mantidos intactos.
(d) Diferença(A, B) que recebe dois conjuntos A e B e devolve a diferença do conjunto A
por B.

19. Considere a implementação de polinômios esparsos utilizando listas encadeadas circulares com
nó cabeça, com os monômios não-nulos ordenados pelo expoente. Escreva uma função para
cada uma das operações abaixo:

(a) Subtrai(p, q) que recebe dois polinômios p e q e devolve o polinômio p − q.


(b) Valor(p, x) que devolve o valor de p em x.
(c) Raiz(p, x) que verifica se x é ou não uma raiz do polinômio p.
20. Escreva um programa que leia uma sequência de n (, [, {, }, ], ) e, usando uma fila ou uma
pilha (decida qual é mais conveniente), decide se a sequência é bem formada.

21. Uma palavra é um palı́ndromo se a sequência de letras que a forma é a mesma seja ela lida da
esquerda para a direita, ou da direita para esquerda. Exemplos: arara, raiar, hanah. Escreva
um programa que leia uma palavra e, usando uma fila ou uma pilha (decida qual é mais
conveniente), decida se ela é um palı́ndromo.

22. O grau de separação de duas pessoas é definido indutivamente da seguinte forma. Duas
pessoas que se conhecem tem grau de separação um. Os conhecidos de um conhecido tem
grau de separação dois e assim por diante. Por exemplo, se:

o Roberto conhece o Maurı́cio, a Luı́sa, a Ana e o Carlos,


o Maurı́cio conhece o Roberto e o Tiago,
o Tiago conhece o Maurı́cio, a Luı́sa e a Teresa,
a Luı́sa conhece o Tiago e o Roberto,
a Ana conhece o Roberto,
o Carlos conhece o Roberto e a Teresa conhece o Tiago,

então o grau de separação do Roberto e do Maurı́cio é um, do Roberto e do Tiago é dois, do


Carlos e da Teresa é quatro. A teoria dos “seis graus de separação” diz que quaisquer duas
pessoas tem grau de separação no máximo seis. Se você tivesse que escrever um programa
que recebesse uma lista de pessoas e a relação de amizade entre elas, como acima, e tivesse
que determinar as duas pessoas com maior grau de separação, para testar a validade desta
teoria, como faria?

23. O problema das 8 rainhas consiste no seguinte: dado um inteiro n, determinar se existe
uma maneira de colocar n rainhas num tabuleiro de xadrez n × n sem que nenhuma delas
ataque a outra. Escreva um algoritmo que resolva o problema das 8 rainhas. Caso exista uma
maneira de colocar n rainhas, seu algoritmo deve imprimir as posições das n rainhas para
uma destas maneiras válidas de colocá-las.

24. O problema do passeio do cavalo consiste no seguinte: dado um inteiro n, determinar


se existe uma maneira de um cavalo se movimentar por todas as posições do tabuleiro de
xadrez, e terminar onde começou, sem passar duas vezes por nenhuma das posições. Escreva
um algoritmo que resolva o problema do passeio do cavalo.

Você também pode gostar