Sunteți pe pagina 1din 10

Pilhas, Filas e Listas

1. 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 insero por estar lotada), a menos que o nmero total de elementos em ambas as pilhas juntas seja n. As operaes PUSH e POP devem ser executadas no tempo O(1). 2. Enquanto uma pilha permite a insero e a eliminao de elementos em apenas uma extremidade e um fila permite a insero em uma extremidade e a eliminao na outra extremidade, uma deque (double-ended queue, ou fila de extremidade dupla) permite a insero e a eliminao em ambas as extremidades. Escreva quatro procedimentos de tempo O(1) para inserir elementos e eliminar elementos de ambas as extremidades de uma deque construda a partir de um vetor. 3. Mostre como implementar uma fila usando duas pilhas. Analise o tempo de execuo das operaes sobre as filas. 4. Mostre como implementar uma pilha usando duas filas. Analise o tempo de execuo das operaes sobre pilhas. 5. Implemente uma pilha usando uma lista simplesmente encadeada. As operaes PUSH e POP devem demorar o tempo O(1). 6. Implemente uma fila usando uma lista simplesmente encadeada. As operaes ENQUEUE e DEQUEUE devem demorar o tempo O(1). 7. Fornea um procedimento no recursivo de tempo ( ) que inverta uma lista simplesmente encadeada de n elementos. Qualquer consumo de memria alm do espao de armazenamento necessrio para a prpria lista deve ter tamanho O(1). 8. Explique como implementar listas duplamente encadeadas usando apenas um valor de ponteiro np[x] por item, em lugar dos dois valores usuais (prximo e anterior). Suponha que todos os valores de ponteiros possam ser interpretados como inteiros de k bits e defina np[x] como np[x] = prximo[x] XOR anterior[x], o ou exclusivo de k bits de prximo [x] e anterior[x].(O valor NULL representado por 0). Certifique-se de descrever as informaes necessrias para obter acesso ao incio da lista. Mostre como implementar operaes para inserir, remover e recuperar elementos nesta lista. Mostre tambm como inverter a ordem dos elementos nesta lista em tempo O(1). 9. Considere uma lista seqencial definida pelas estruturas de dados abaixo:
typedef struct { char nome[41]; char matricula[11]; float cr; } ALUNO; // registro de um aluno // nome do aluno // matricula do aluno // C.R. do aluno

typedef struct // lista de alunos { ALUNO aluno[200]; // registros dos alunos int numAlunos; // numero de alunos na lista } LISTA_ALUNOS;

a. Calcule o tamanho (em bytes) dos tipos de dados ALUNO e LISTA_ALUNOS, considerando que o tipo char tem tamanho de 1 byte e os tipos int e float tm tamanho de 4 bytes. b. Construa uma funo que retorne a quantidade de alunos com coeficiente de rendimento maior ou igual a 7. Prottipo: int numAlunosCrAlto(LISTA_ALUNOS *pLista) c. Construa uma funo que receba a matrcula de um aluno e exclua este aluno da lista. A funo deve retornar o valor 0 caso a excluso seja bemsucedida, ou o valor 1 caso o aluno no seja encontrado na lista. Prottipo: int excluirAluno(LISTA_ALUNOS *pLista, char
*matricula)

10. Considere uma lista ordenada de itens disponveis no almoxarifado de uma fbrica, sendo que cada item identificado por um cdigo numrico exclusivo:
typedef struct { int codItem; char descricao[21]; int qtdEstoque; } ITEM; typedef struct { ITEM item[5000]; int numItens; } LISTA_ITENS; // item do almoxarifado // cdigo de identificao do item // texto descritivo do item // quantidade disponvel em estoque // lista de itens // registros dos itens // numero de itens na lista

a. Supondo que a lista no esteja ordenada, construa uma funo que receba um cdigo de identificao de item e retorne a quantidade disponvel em estoque para o item correspondente (caso o item no exista na lista, deve ser retornado o valor 0). Prottipo: int pesquisar(LISTA_ITENS *pLista, int cod) b. Supondo agora que a lista esteja ordenada, construa uma nova verso da mesma funo construda no item (a) utilizando pesquisa binria.

11. Nesta questo, voc implementar uma pilha de caracteres e a utilizar em uma aplicao. a) Defina um tipo de dado denominado PILHA que represente uma pilha capaz de armazenar at 200 elementos do tipo primitivo char e construa as funes empilhar e desempilhar para esta estrutura. Prottipos:
int empilhar(PILHA *pPilha, char c int desempilhar(PILHA *pPilha, char *c)

b)

Construa uma funo que verifique se uma palavra palndroma, ou seja, se a palavra se mantm igual quando lida de trs para frente (exemplos: "radar", "arara", etc.). A funo deve declarar uma varivel do tipo PILHA e utilizar as funes empilhar e desempilhar construdas no item (a). Deve ser retornado o valor inteiro 0 quando a palavra for palndroma, 1 quando no for palndroma e 2 quando ocorrer estouro de pilha. Prottipo: int palindroma(char *palavra)

12. Uma empresa de manuteno de equipamentos est implementando um sistema de controle de atendimento a chamados de clientes. O sistema deve ser capaz de cadastrar os chamados solicitados pelos clientes e deve garantir que os chamados sejam atendidos na mesma ordem em que tiverem sido cadastrados. Supondo que j exista um tipo de dados definido como CHAMADO que contm todas as informaes necessrias para o cadastramento e atendimento de um chamado, implemente o que se pede abaixo: a. Defina um tipo de dados denominado FILA_CHAMADOS, que implemente uma fila circular de registros do tipo CHAMADO, com capacidade mxima de 500 chamados simultneos. b. Construa uma funo para cadastramento de chamados, cuja finalidade seja enfileirar um novo registro do tipo CHAMADO em uma fila circular do tipo FILA_CHAMADOS. cadastrarChamado(FILA_CHAMADOS *pFila, Prottipo: int
CHAMADO *pChamado)

c. Construa uma funo para atendimento de chamados, cuja finalidade seja desenfileirar um registro do tipo CHAMADO de uma fila circular do tipo FILA_CHAMADOS. Prottipo: int atenderChamado(FILA_CHAMADOS *pFila,
CHAMADO *pChamado)

obs: as funes para cadastrar e atender chamados devem retornar o valor 0 quando a operao for bem-sucedida, ou um valor diferente de 0, quando ocorrer algum erro que impossibilite a operao.
13. Considere uma lista dos clientes de uma empresa, definida pelas seguintes estruturas de dados:
typedef struct { char nome[41]; int idade; float rendaMensal; } CLIENTE; // dados do cliente // // // nome do cliente idade do cliente renda mensal do cliente

typedef struct // lista de clientes { CLIENTE cliente[5000]; // registros dos clientes int numClientes ; // nmero de clientes armazenados } LISTA_CLIENTES;

Escreva funes em linguagem C para ordenar uma lista do tipo LISTA_CLIENTES, utilizando algoritmo de ordenao de sua livre escolha, conforme com os seguintes critrios: a. Pelo campo nome (ordem lexicogrfica crescente)
Prottipo: ordenarNome(LISTA_CLIENTES *pLista)

b. Pelos campos idade (ordem crescente) + rendaMensal (ordem decrescente)


Prottipo: ordenarIdadeRenda(LISTA_CLIENTES *pLista)

14. Considere agora uma verso encadeada da lista de clientes descrita na questo anterior, definida pelas seguintes estruturas de dados:
typedef struct { CLIENTE cliente; void * pProximo; } ELEMENTO; // Estrutura de um elemento da lista // dados do cliente // ponteiro para o prximo elemento

typedef struct // Estrutura da lista encadeada { CLIENTE * pPrimeiro; // ponteiro para o primeiro elemento } LISTA_ENCADEADA;

Escreva funes em linguagem C para efetuar as operaes solicitadas em cada item a seguir: a. Retornar o nmero de clientes com renda mensal igual ou superior a 1000.
Prottipo: int numClientesRendaAlta(LISTA_ENCADEADA *pLista)

b. Retornar ponteiro para o cliente mais velho da lista (retornar NULL em caso de lista vazia).
Prottipo: CLIENTE *clienteMaisVelho(LISTA_ENCADEADA *pLista)

15. Escreva funes em linguagem C para enfileirar e desenfileirar pacientes de uma fila circular do tipo FILA_PACIENTES, conforme os prottipos abaixo:
int enfileirar(FILA_PACIENTES *pFila, PACIENTE *pPaciente) int desenfileirar(FILA_PACIENTES*pFila,PACIENTE *pPaciente)

O valor de retorno deve ser igual a 0 quando a operao for bem sucedida, ou igual a 1 quando ocorrer alguma situao em que a operao no possa ser efetuada.

16. Nesta questo, voc implementar uma pilha de caracteres e a utilizar em uma aplicao. a. Defina um tipo de dado que represente uma pilha capaz de armazenar at 200 elementos do tipo primitivo char e construa as funes empilhar e desempilhar para esta estrutura. b. Construa uma funo que receba como parmetro uma string contendo uma instruo em linguagem C e verifique se os parnteses e colchetes esto consistentes, utilizando a pilha que voc definiu (exemplo: "x=2*(a[5*(2+b[i])]-c[j]);" uma expresso consistente, mas "x=2*(a[5*(2+b[i])-c[j]);" e "x=2*a[5*(2+b[i])]-c[j]);" no so). 17. Considere uma lista simplesmente encadeada cujos elementos possuam a estrutura abaixo, onde o tipo ALUNO foi definido na questo 1:
typedef struct { ALUNO aluno; // dados do aluno void * pProximoAluno; // ponteiro para prximo aluno } ELEMENTO;

A lista deve ser representada por um ponteiro do tipo ELEMENTO * apontando para um "n-cabea" cujo campo pProximoAluno aponta para o primeiro aluno da lista. Escreva os algoritmos necessrios para efetuar cada as operaes especificadas abaixo: a. Retornar a quantidade de alunos com coeficiente de rendimento maior ou igual a 7.
int numAlunosCrAlto(ELEMENTO *pLista)

b. Excluir da lista todos os alunos com coeficiente de rendimento menor que 5.


void excluirAlunosCrBaixo(ELEMENTO *pLista)

c. Retornar o nome do aluno com o maior coeficiente de rendimento da lista.


char * nomeAlunoMaiorCr(ELEMENTO *pLista)

18. Nesta questo, voc trabalhar com filas circulares e construir um sistema de gerenciamento de filas de impresso (spooler). Um spooler utilizado quando uma impressora de rede compartilhada por diversos usurios. Ao se inserir um arquivo no spooler, especifica-se um nvel de prioridade para aquele arquivo. Arquivos com mesmo nvel de prioridade so processados em ordem de chegada, mas arquivos com nvel de prioridade mais alto so sempre processados antes dos arquivos com prioridade mais baixa (mesmo tendo chegado depois). Considere um spooler composto por 3 filas, conforme a estrutura abaixo, onde o tipo de dado FILA uma implementao padro de fila circular:
typedef { FILA FilaAlta; FILA FilaMedia; FILA FilaBaixa; } SPOOLER; // Fila de prioridade alta // Fila de prioridade mdia // Fila de prioridade baixa

a. Defina o tipo de dado FILA para uma fila circular capaz de armazenar at 50 elementos do tipo FILE * e construa as funes enfileirar e desenfileirar para esta estrutura. Estas funes devem retornar um cdigo indicando se foi possvel realizar a operao. b. Construa a funo inserirSpooler(SPOOLER *,FILE *,char), que enfileira o ponteiro de arquivo recebido na fila com a prioridade especificada ('A'=alta; 'M'=mdia; 'B'=baixa), e a funo retirarSpooler(SPOOLER *,FILE *), que desenfileira o ponteiro de arquivo que estiver no incio da fila de mais alta prioridade que no esteja vazia. 19. Considere uma verso duplamente encadeada (com "n-cabea") da lista descrita na questo anterior, cujos elementos possuam a estrutura
typedef struct

{
DADOS_CLIENTE dados; // dados do cliente void * pProximoCliente; // ponteiro para prximo cliente void * pClienteAnterior; // ponteiro para cliente anterior } ELEMENTO;

Escreva os algoritmos necessrios para efetuar cada as operaes definidas abaixo:

a. Trocar um elemento de posio com o seu sucessor


void trocarPosicao(ELEMENTO *pElemento)

b. Ordenar os elementos da lista em ordem crescente de idade, utilizando bubblesort.


void ordenarBolha(ELEMENTO *pLista)

20. Considere uma lista encadeada que armazena os clientes de uma empresa, definida pelas seguintes estruturas de dados:
typedef struct { char nome[41]; char telefone[15]; int idade; } DADOS_CLIENTE; // Dados de um cliente da empresa // // // nome do cliente telefone do cliente idade do cliente

typedef struct // N da lista encadeada { DADOS_CLIENTE dados; // dados do cliente void * pProximoCliente; // ponteiro para prximo cliente } CLIENTE; typedef struct // Lista encadeada de clientes { CLIENTE * pPrimeiroCliente; // ponteiro p/ primeiro cliente } LISTA_CLIENTES;

Escreva funes em linguagem C para efetuar as operaes solicitadas em cada item a seguir: a. Retornar o nmero total de clientes armazenados na lista.
int numElementos(LISTA_CLIENTES *pLista)

b. Retornar os dados do cliente mais velho da lista.


DADOS_CLIENTE *dadosClienteMaisVelho(LISTA_CLIENTES *pLista)

c. Excluir da lista todos os clientes com idade maior ou igual a 65 anos.


void excluirIdosos(LISTA_CLIENTES *pLista)

rvores
1. Fornea um algoritmo no recursivo que execute um percurso de rvore em ordem. (Sugesto: Existe uma soluo fcil que usa uma pilha como uma estrutura de dados auxiliar e uma soluo mais complicada, embora elegante, que no emprega nenhuma pilha mas pressupe que possvel testar a igualdade entre dois ponteiros.) 2. Fornea algoritmos recursivos que executem caminhos de rvores de pr-ordem e ps-ordem no tempo ( ) em uma rvore de n ns. 3. Mostre que, se um n em uma rvore de pesquisa binria tem dois filhos, ento seu sucessor no tem nenhum filho da esquerda e seu predecessor no tem nenhum filho da direita. 4. Um percurso de rvore em ordem de uma rvore de pesquisa binria de n ns pode ser implementado encontrando-se o elemento mnimo na rvore com TREEMINIMUM e, em seguida, fazendo-se n-1 chamadas a TREE-SUCESSOR. Prove que este algoritmo executado em tempo ( ).

5. Podemos classificar um dado conjunto de n nmeros construindo primeiro uma rvore de pesquisa binria contendo esses nmeros ( usando TREE-INSERT repetidamente para inserir os nmeros um a um), e depois imprimindo os nmeros por meio de um percurso de rvore em ordem. Quais so os tempos de execuo no pior caso e no melhor caso para esse algoritmo de ordenao?

6. Dadas duas cadeias = = onde cada e cada pertencem a algum conjunto ordenado de caracteres, dizemos que a cadeia a lexicograficamente menor que a cadeia b se

1- Existe um inteiro j, onde 0 min ( , ), tal que = 0, 1, 1 < , ou 2< = para todo = 0, 1, , .

para todo

Por exemplo, se a e b so cadeias de bits, ento 10100 < 10110 pela regra 1 (fazendo-se j = 3) e 10100 < 101000 pela regra 2. Isso semelhante ordenao utilizada nos dicionrios de idiomas. A estrutura de dados raiz de rvore mostrada na figura abaixo armazena as cadeias , de bits 1011, 10, 011, 100 e 0. Quando procuramos por uma chave = vamos para a esquerda em um n de profundidade i se = 0 e para a direita se = 1. Seja S um conjunto de cadeias binrias distintas cujos comprimentos produzem a soma n. Mostre como usar uma raiz de rvore para ordenar lexicograficamente o conjunto S no tempo ( ). No caso do exemplo da Figura, a sada da ordenao deve ser a sequncia 0, 011, 10, 100, 1011.

7. Considere a rvore binria de busca representada no diagrama abaixo, no qual so exibidos os valores das chaves de ordenao numricas correspondentes a cada n:

a. Indique a ordem em que os ns da rvore acima seriam visitados em um percurso pr-ordem e em um percurso ps-ordem. b. Mostre que rvore acima AVL, indicando, para cada n, as alturas das subrvores esquerda e direita e o fator de balano correspondente. c. Redesenhe a rvore aps a insero de um novo elemento cuja chave de ordenao tenha valor 60 e demonstre que a rvore deixar de ser AVL, indicando os ns que ficaro desregulados e seus respectivos balanos. d. Indique qual o tipo de rotao que deve ser aplicada para que a rvore volte a ser AVL aps a incluso do novo elemento e redesenhe a rvore aps a aplicao dessa rotao.

8. Considere uma lista telefnica armazenada na forma de uma rvore binria de busca, representada pelas estruturas de dados definidas abaixo:
typedef struct {char nome[41]; char telefone[11];} ASSINANTE; typedef struct {ASSINANTE a; void *pDir; void *pEsq;} NO;

a. Construa uma funo recursiva que receba o nome de um assinante e retorne o seu telefone (a funo deve retornar NULL caso o assinante no seja encontrado na lista). Prottipo: char * pesquisarTelefone(NO * pNoRaiz, char
*nomeAssinante)

b. Construa uma funo recursiva que exiba a lista de assinantes em ordem alfabtica (dica: faa um percurso em ordem simtrica, imprimindo nome e telefone para cada n visitado). Prottipo: void exibirLista(NO *pNoRaiz) c. Construa uma funo recursiva que retorne a altura da rvore. Prottipo: int determinarAltura(NO *pNoRaiz) 9. Considere um cadastro de alunos armazenado em uma rvore binria de busca representada pelas estruturas de dados abaixo, utilizando o campo nome como chave de ordenao:
typedef struct { char nome[51]; int idade; } ALUNO; typedef struct { ALUNO raiz; void *pSubArvDir; void *pSubArvEsq; } ARVORE;

a. Construa uma funo recursiva que receba o nome de um aluno e retorne a sua idade (a funo deve retornar NULL caso o aluno no seja encontrado na rvore). Prottipo: int pesquisarIdadeAluno(ARVORE *pArvore, char
*nomeAluno)

b. Construa uma funo recursiva que imprima os nomes de todos os alunos cadastrados na rvore em ordem alfabtica (dica: implemente um percurso em ordem simtrica). Prottipo: void imprimirNomes(ARVORE *pArvore) c. Construa uma funo recursiva que receba um ponteiro para uma estrutura do tipo ARVORE e execute uma rotao dupla direita na raiz da rvore AVL representada nesta estrutura. Prottipo: void rotacaoDuplaDireita(ARVORE *pArvore)

10. Considere um cadastro de funcionrios armazenado na forma de uma rvore binria de busca representada pelas estruturas de dados definidas abaixo:
typedef struct { int matricula; char nome[41]; float salario; } FUNCIONARIO; typedef struct { FUNCIONARIO raiz; void *pSubArvoreEsq; void *pSubArvoreDir; } ARVORE; // DADOS DO FUNCIONARIO // matricula do funcionario // nome do funcionario // salario do funcionario // ARVORE BINARIA DE BUSCA // dados do funcionario // ponteiro para subarvore esquerda // ponteiro para subarvore direita

Construa uma funo recursiva que receba a matrcula de um funcionrio e retorne o seu salrio. Prottipo:
float salarioFuncionario(ARVORE *pArvore, int matricula)

S-ar putea să vă placă și