19.04.2013 Views

Exercícios Listas Pilhas Filas

Exercícios Listas Pilhas Filas

Exercícios Listas Pilhas Filas

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Disciplina: Estrutura de Dados<br />

Prof.: Marcos Portnoi<br />

<strong>Exercícios</strong> 3 – <strong>Listas</strong> Estáticas, Encadeadas, <strong>Pilhas</strong>, <strong>Filas</strong><br />

OBS: Nos problemas a seguir, é interessante a construção de uma biblioteca em C para implementar o Tipo<br />

Abstrato de Dados (TAD) Lista Linear e suas operações clássicas.<br />

PARTE 1 – <strong>Listas</strong> Lineares com Alocação Estática<br />

1- Implemente um algoritmo que retira um elemento da posição pos1 e coloca na pos2. Use os algoritmos de<br />

inserção e remoção definidos anteriormente (chame as funções implementadas no TAD Lista).<br />

2- Os sistemas operacionais e outros aplicativos normalmente registram em arquivo as atividades relevantes<br />

dos usuários. Esta relevância é especificada pelo administrador. Por exemplo, um arquivo do tipo log, em<br />

formato texto, pode ter registrado todos os nomes de usuários que efetuaram login em um período, a data<br />

do login, o horário do login e o horário do logout. Este arquivo pode ser examinado em busca de atividades<br />

suspeitas. Escreva um programa para auxiliar o administrador nesta tarefa.<br />

Considere a existência de um arquivo fictício login.log, onde estão armazenados, em cada<br />

linha, nome (login) do usuário, data de login, horário de login e horário de logout.<br />

Construir as estruturas de dados apropriadas para conter os dados.<br />

Ler o arquivo e preencher uma lista estática.<br />

Implementar as seguintes funções para o usuário, que serão mostradas em um menu:<br />

1. mostraUsuarios: visualizar na tela todos os nomes que aparecem no arquivo,<br />

desprezando repetições de nomes de login.<br />

2. mostraAposHora: visualizar na tela todos os nomes que efetuaram login após um<br />

horário indicado pelo administrador.<br />

3. mostraAcessoUsuario: visualiza todos os acesso feitos por um determinado nome<br />

indicado pelo administrador.<br />

3- Implemente uma nova função de inserção em lista seqüencial de forma que ela insira NrCopias cópias de<br />

um certo dado a partir de uma posição Pos.<br />

void InsereNC(TipoLista *Lista, TipoItem Item, Apontador Pos, int NrCopias);<br />

4- Implemente uma nova função de remoção em lista seqüencial de forma que ela remova de uma só vez Qte<br />

elementos a partir de uma posição Pos.<br />

void RemoveNC(TipoLista *Lista, Apontador Pos, int Qte);<br />

5- Escreva o código das seguintes operações adicionais para o TAD Lista Linear (supondo a implementação<br />

feita através de um vetor):<br />

Verificar se uma Lista L1 está ordenada (em ordem crescente ou decrescente)<br />

Copiar uma Lista L1 para uma outra L2. Use necessariamente a função insere.<br />

Copiar uma Lista L1 para uma Lista L2 eliminando elementos repetidos. Use a função insere.<br />

Inverter uma lista L1<br />

Intercalar L1 com L2 gerando L3 sem elementos repetidos (considere L1 e L2 ordenadas)<br />

A partir de L1 e L2, gere L4 considerando os elementos repetidos em ambas as listas (considere L1 e L2<br />

ordenadas)<br />

6- Construa uma função que recebe como parâmetros uma Lista L1 e um valor x e que retire os primeiros x da<br />

lista L1, inserindo-os no fim de L1. Use as funções de inserção e remoção já implementados. Suponha que a<br />

lista está inicialmente preenchida. É proibido o uso de uma lista auxiliar.<br />

7- Uma lista com alocação encadeada pode ser implementada de maneira estática utilizando-se um vetor<br />

como mostrado abaixo. A grande vantagem deste tipo de implementação é que ela evita movimentos<br />

durante inserção e remoção de elementos da lista. Implemente as operações de remoção e inserção para<br />

esta estrutura de lista.<br />

1/4


Disciplina: Estrutura de Dados<br />

Prof.: Marcos Portnoi<br />

const int N=100; {no máximo de elementos}<br />

const int nil=0; {valor 0 indica fim da<br />

lista}<br />

typedef struct {<br />

int chave;<br />

int prox;<br />

} Telem;<br />

Typedef struct {<br />

Telem A[N];<br />

int Primeiro,Ultimo;<br />

int Disponivel;<br />

} Lista;<br />

PARTE 2 – <strong>Listas</strong> Encadeadas com Alocação Dinâmica<br />

4<br />

x3 9<br />

x1 7<br />

x2 2<br />

x4 0<br />

Insere x5<br />

4<br />

x3 9<br />

x5 0<br />

x1 7<br />

x2 2<br />

x4 3<br />

8- Escreva uma função que receba como parâmetro uma lista encadeada contendo apenas valores 0 e 1 e<br />

que retorne as posições inicial e final da maior seqüência S de elementos 0 dentro da lista.<br />

Ex: Lista={0,1,1,0,0,0,1,0} pini = 4 e pfim = 6 S={0,0,0}<br />

Obs: No caso de empate em tamanho, a primeira ocorrência de S é a que deve ser retornada.<br />

9- Construa um algoritmo que retira um elemento da posição pos1 e coloca na pos2.<br />

10- Considere uma lista simplesmente encadeada L1 representando uma seqüência de caracteres. Construa<br />

uma função para imprimir a seqüência de caracteres da lista L1 na ordem inversa (não é permitido o uso de<br />

listas auxiliares).<br />

Ex: Para a lista L1={A,E,I,O,U}, a função deve imprimir “UOIEA”.<br />

11- Repita a questão 4 considerando agora que a lista linear foi implementada através de vetores.<br />

12- Para a lista duplamente encadeada representada pela figura a seguir, escreva:<br />

nó-cabeça<br />

(a) A estrutura de dados para implementar esta lista.<br />

x 1 x 2 x 3 x N<br />

(b) A função TipoItem *Locate(TipoLista L, int P) que retorna o apontador para o item na P-ésima<br />

posição de L. Retorne NULL se a lista tiver menos que P elementos.<br />

(c) A função void InsereP(TipoLista *L, TipoItem E, int P) que insere o item E na posição P da<br />

lista L. Use a função Locate(L,P) neste procedimento. Retorne erro se a lista tiver menos que P 1 itens.<br />

(d) A função TipoItem RemovaP(TipoLista *L, int P) que remove e retorne o item na P-ésima posição<br />

da lista L. Use a função Locate(L,P) neste procedimento. Retorne erro se a lista tiver menos que P itens.<br />

13- Escreva os algoritmos de inserção e remoção de um elemento para uma lista duplamente encadeada. Use<br />

uma função TipoItem *Busca_Dup_Ord(TipoLista L, TipoChave x) que retorna um ponteiro para o nó<br />

com chave igual a x na lista L.<br />

14- Considere duas listas simplesmente encadeada de números inteiros L1 e L2<br />

(a) Crie uma lista L3 que seja a união sem repetição de L1 e L2<br />

(b) Crie uma lista L4 que seja a intersecção dos elementos que estão em L1<br />

PARTE 3 – <strong>Pilhas</strong> e <strong>Filas</strong><br />

15- Escreva um programa para verificar se uma expressão matemática tem os parênteses agrupados de forma<br />

correta, isto é: (1) se o número de parênteses à esquerda e à direita são iguais e; (2) se todo parêntese<br />

2/4


Disciplina: Estrutura de Dados<br />

Prof.: Marcos Portnoi<br />

aberto é seguido posteriormente por um fechamento de parêntese. (ver Capítulo 2 do Livro do<br />

Tenembaum).<br />

Ex1: As expressões ((A+B) ou A+B( violam a condição 1<br />

Ex2: As expressões )A+B( – C ou (A+B)) – (C + D violam a condição 2<br />

16- Escreva um algoritmo para determinar se uma string de caracteres de entrada é da forma xCy, onde x é<br />

uma string consistindo das letras A e B e y é o inverso de x, isto é se x = ABABBA (use uma pilha para<br />

resolver o problema).<br />

17- Mostre como uma pilha pode ser implementada utilizando duas filas. Analise o tempo das operações de<br />

empilhar (PUSH) e desempilhar (POP).<br />

18- Deque (ou fila de duas pontas) é uma estrutura de dados que consiste de uma lista na qual as seguintes<br />

operaçõoes são permitidas:<br />

(a) Empilha(A) Insere o elemento A no início da deque.<br />

(b) Desempilha() Remove o elemento que está no início da deque.<br />

(c) Inject(A) Insere o elemento A no final da deque.<br />

(d) Eject() Remove o elemento que está no final da deque.<br />

Crie uma estrutura de dados adequada e implemente as operações acima.<br />

19- Considere o seguinte conjunto de números 1234 e as seguintes operações:<br />

(a) inserir o no. 1 em uma pilha;<br />

(b) inserir o 2 na pilha;<br />

(c) retirar o 2 da pilha;<br />

(d) inserir o 3 na pilha;<br />

(e) inserir o 4 na pilha;<br />

(f) retirar o 4 da pilha;.<br />

(g) retirar o 3 da pilha;<br />

(h) retirar o 1 da pilha.<br />

A seqüência de saídas do procedimento acima é 2431. Considere agora a seqüência 123456.<br />

a) Podemos obter as seqüências 325641 e 154623 utilizando um processo semelhante ao do<br />

exemplo anterior?<br />

b) Se I e R representam respectivamente inserção e remoção da pilha, o exemplo acima pode ser<br />

descrito como IIRIIRRR. Se possível descreva as seqüências do item (a) em termos de I e R.<br />

c) Qual seria uma regra simples para anlisar se uma sequ^encia de I's e R's é valida?<br />

d) Interprete a seguinte proposição: Existe uma permutação p1p2 ... pn dos números 1234...n<br />

usando uma pilha se e somente se não existem índices i < j < k tal que pj < pk < pi.<br />

20- Duas pilhas podem ser implementadas em um único array A da seguinte forma: A primeira pilha<br />

cresce a partir do início do array para direita e a segunda cresce a partir do final do array para a<br />

esquerda, ou seja, as pilhas crescem uma em direção a outra. Escreva os seguintes procedimentos:<br />

(a) Empilha(A,i) insere o elemento A na pilha i = 1,2.<br />

(b) Desempilha(i) retorna o elemento que está no topo da pilha i = 1,2.<br />

Existe um problema com este tipo de implementação. Qual é?<br />

3/4


Disciplina: Estrutura de Dados<br />

Prof.: Marcos Portnoi<br />

Referências:<br />

1- SZWARCFITER, J.L.; MARKENZON, L. Estruturas de Dados e Seus Algoritmos. Editora<br />

LTC, 1998.<br />

2- TENENBAUM, A.M.; LANGSAM Y.; AUGENSTEIN,M.A. - Estruturas de Dados em C -<br />

Prentice-Hall, 1993.<br />

3- Lista do Prof Luis Gustavo Nonato (ICMC-USP, São Carlos), SCE5763, 2000.<br />

4/4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!