Buscar

Estruturas de Dados: Pilha, fila e Lista

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 11 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Estruturas de Dados 1
🌑
Estruturas de Dados 
Biblioteca
Para poder estudar essa parte da materia foi necessário baixar uma biblioteca 
chamada cdslib
Implementação Conceitual
Pilha
Na pilha o último elemento que entra é o primeiro que sai
Operações Básicas:
Empilhar: que vai colocando um objeto em cima do outro
Desempilhar: que vai tirando os objetos
Legenda da imagem:
Verde: Está mostrando a quantidade de elementos dentro da pilha e onde sera 
colocado o próximo elemento
Vermelho: Está mostrando o local onde os elementos ficam
Amarelo: Indica a enumeração das "casas" dos elementos
Seta: Mostra a direção em que os elementos vão sendo colocados
Documentação
Pilha
Fila
Na fila o primeiro elemento que entra é sempre o primeiro que sai.
https://iuricardoso.github.io/cdslib/stack_8h.html
Estruturas de Dados 2
Operações Básicas:
Insersação: Adicionar um elemento no final da fila
Remoção: Retirar o primeiro elemento da fila
A fila é baseada em:
Posição Inicial
Tem a função de mostrar onde começa a fila
Muda quando um elemento é tirado, pois sempre é retirado o primeiro 
elemento
Posição Final
Mostra onde termina a fila
Muda quando se adiciona um elemento
Observações
As duas posições ficam iguais quando: A fila está vazia ou cheia
O que define se é um o outro é a quantidade de elementos que tem dentro da 
fila
A fila inicia com lixo, e quando se tira um elemento ele se torna lixo, pois não 
tem como apagar um elemento
Documentação
Fila
Lista
Qualquer momento pode ser adicionado e removido um elemento em qualquer 
posição.
Outras caracteristica da lista é a existencia de diversas operações.
A utilização ideal da lista é usar locação dinâmica, pois se usar vetor não funciona 
muito bem. Porem a biblioteca usada usa uam forma estática.
https://iuricardoso.github.io/cdslib/queue_8h.html
Estruturas de Dados 3
Legenda da imagem:
Vermelho: Esse é o espaço inicial que se tem
Amarelo: É onde indica a quantidade de elementos dentro da lista
Verde: É onde se encontra o primeiro vetor
Exemplo de campo em Azul: Na esquerda temos onde fica o elemento e na direita 
temos onde fica o vetor que vai apontar para o proximo elemento.
Documentação
Lista
Observação
O primeiro campo é nulo e quando se coloca o primeiro elemento esse vetor 
apento para o elemento.
Quando se tira um elemento ou se coloca um elemento, o que vai se alterando 
é os locais onde estava ou vai estar o elemento e para onde os ponteiros 
estão apontando
Exemplo: Se tirar o elemento X, o primeiro vetor vai apontar agora para o 
elemento A, e a "caixa" que antes continha o elemento X e o ponteiro que 
está ao lado dele sumiria.
UTILIZANDO NA LINGUAGEM C
Pilha
Precisar usar a biblioteca stack
#include "stack.h"
Exemplo 1
https://iuricardoso.github.io/cdslib/list_8h.html
Estruturas de Dados 4
#include <stdlib.h>#include <stdio.h>#include "stack.h"void exemploA(void); 
 
int main()
{ 
 exemploA() 
 system("PAUSE"); 
 system("CLS"); 
 
 return 0;
}
void exemploA(void)
{ 
 
 STACK s = stackCreate(3,sizeof(int)); //criando uma pilha de 3 elementos 
 
//por mais que esteja sendo criado um vetor, ele aloca esse vetor 
 
 if (s== NULL) //testando se vai ser possível alocar 
 { 
 printf("ERRO: nao ha memoria suficiente. '\n"); 
 exit(1); 
 } 
 
 
 int e; //vai ser usado para enviar os elementos para empilhar e desempilhar 
 
 
 printf("Pilha tem capacidade para %d elementos. \n", stackCapacity(s)); //passa a pilha
 como parametro 
 
 
 
 e = 10; // primeiro valor 
 
//ao mesmo tempo que a função abaixo empilha ela também testa se da ou não através do if 
 
 if(!stackPush(s, &e)) // se usa o &e pois se consegue empilhar qualquer tipo de dado, en
tão precisa especifica que pode ser um endereço para qual quer coisa 
 
 { 
 printf("Nao foi possivel empilhar %d. Pilha esta cheia!",e); 
 } 
 else 
 { 
 printf("Empilhado: %d\n",e); 
 } 
 
 e = 20; //segundo valor 
 stackPush(s, &e); 
 printf("Empilhado: %d \n", e); 
 
 e = 30; //terçeiro valor 
 stackPush(s, &e); 
 printf("Empilhado: %d \n", e); 
 
 printf("Quantidade de elementos epilhados: %d \n", stackSize(s)); //mostra a quantidad
e de elementos que é 3 nesse caso
if(stackPeekTop(s, &e)) //mostra qual o elemento no topo da pilha 
 { 
 printf("Elemento do topo: %d \n", e); //vai mostrar 30 
Estruturas de Dados 5
 } 
 else 
 { 
 //erro: pilha vazia 
 } 
 
 printf("Tamanho da pilha: %d \n", stackSize(s)); //vai da 3
 e = 100; 
 
 if(!stackPush(s, &e)) 
 { 
 printf("Impossivel empilhar %d. Pilha esta cheia!\n") 
 printf("tamanho da pilha: %d \n \n", stackSize(s)); 
 } 
 else 
 { 
 //empilhou 
 } 
 
 printf("Desempilhando"); 
 while(stackPop(s, &e)) //Aqui temos que enquanto tiver elementos vai desempilhar 
 { 
 printf("%d", e); 
 } 
 
 printf("\n Tamanho da pilha: %d \n", stackSize(s)); 
 
 stackFree(s); //liberando a memória
} 
 
 
Exemplo 2
#include <stdlib.h>#include <stdio.h>#include "stack.h"void exemploB(void); 
 
 
int main()
{ 
 exemploB() 
 system("PAUSE"); 
 system("CLS"); 
 
 
 return 0;
}
struct Livro
{ 
 char titulo[50] 
 int paginas;
}
void exemploB(void)
{ 
 STACK pilha = stackCreate(5, sizeof(struct Livro)); 
Estruturas de Dados 6
 
 struct Livro livro; //criação da váriavel
// É possivel iniciar uma struct dessa forma 
 
 const struct Livro estrut_dad_descomp = 
 { 
 .titulo = "Estrutura de Dados complicada", 
 .paginas = 411 
 }; 
 
 const struct Livro intro_estru_dad = 
 { 
 .titulo = "Introducao a Estruturas de Dados", 
 .paginas = 411 
 }; 
 
 const struct Livro linguagem_c = 
 { 
 .titulo = "Linguagem C Completa e Descomplicada", 
 .paginas = 411 
 }; 
 
 stackPush(pilha, &estrut_dad_descomp); 
 printf("Empilhado: %s, %d pag \n", estrut_dad_descomp.titulo, estrut_dad_descomp.paginas
); 
 
 stackPush(pilha, &intro_estru_dad); 
 printf("Empilhado: %s, %d pag \n", intro_estru_dad.titulo, intro_estru_dad.paginas); 
 
 stackPush(pilha, &linguagem_c); 
 printf("Empilhado: %s, %d pag \n", linguagem_c.titulo, linguagem_c.paginas); 
 
 livro = (struct Livro) 
 { 
 .titulo = "treinamento em Linguagem C", 
 . paginas = 405 
 }; 
 stackPush(pilha, &livro); 
 printf("Empilhado: %s, %d pag \n", livro.titulo, livro.paginas); 
 stackPeekTop(pilha, &livro); 
 
 printf("\n Topo: %s, %d pag \n", livro.titulo, livro.paginas); 
 printf("Quantidade de livros na pilha: %d \n\n", stackSize(pilha));
 StackPop(pilha,%livro); 
 printf("Desempilhando: %s, %d pag \n", livro.titulo, livro.paginas); 
 
 StackPop(pilha,%livro); 
 printf("Desempilhando: %s, %d pag \n", livro.titulo, livro.paginas); 
 
 StackPop(pilha,%livro); 
 printf("Desempilhando: %s, %d pag \n", livro.titulo, livro.paginas); 
 
 StackPop(pilha,%livro); 
 printf("Desempilhando: %s, %d pag \n", livro.titulo, livro.paginas); 
 
 printf("Quantidade de livros na pilha: %d \n\n", stackSize(pilha)); 
 
 stackFree(pilha); 
Estruturas de Dados 7
 
}
Fila
Usa a biblioteca queue
#include "queue.h"
Exemplo
#include <stdio.h>#include "queue" 
 
void imprimeDadosFila(QUEUE f); //funções criadas para auxiliar
void adicionaBoneco(QUEUE f, char boneco[]);
int main()
{ 
 
 QUEUE f = queueCreate(4, sizeof(char *)); // cria uma fila de capacidade máxima para 4 
strings. 
 
 char * boneco; //cria um ponteiro 
 
 
 if (f == NULL) //testando se funciona a alocação 
 { 
 printf("ERRO: não conseguiu alocar a fila.\n"); 
 return 1; 
 }
//Adicionando primeiro elemento 
 
 boneco = "Luke Skywalker"; 
 if (! queueAdd(f, &boneco)) //função para adicionar 
 { 
 printf("ERRO: fila cheia. Não adicionou: '%s'.\n", boneco); 
 } 
 else 
 { 
 printf("Boneco adicionado na fila: %s\n", boneco); 
 
 char * primeiro; //criando um ponteiro para receber uma copia do primeiro elemento 
 if (queuePeek(f, &primeiro)) //função para pegar o primeiro elemento{ 
 printf("Primeiro da fila: %s\n", primeiro); 
 } 
 } 
 
 printf("Tamanho da fila: %d\n\n", queueSize(f)); //testando o tamanho 
 
 // Adiciona segundo elemento 
 
 adicionaBoneco(f, "Axl Rose"); //aqui está sendo usado uma função auxiliar 
 imprimeDadosFila(f); 
 
 // Adiciona terceiro elemento 
 
 adicionaBoneco(f, "Vegeta"); 
Estruturas de Dados 8
 
 imprimeDadosFila(f); //função auxiliar
 // Remove primeiro elemento 
 if (queueRemove(f, &boneco)) //função de remover 
 { 
 printf("Removido: '%s'\n", boneco); 
 } 
 else 
 { 
 printf("Não conseguiu remover boneco da fila\n"); //isso só vai acontecer se a fi
la tiver cheia 
 } 
 imprimeDadosFila(f); //função auxiliar
 // Adiciona Goku na fila 
 adicionaBoneco(f, "Goku"); 
 imprimeDadosFila(f); 
 
 // Adiciona Luke Skywalker na fila 
 adicionaBoneco(f, "Luke Skywalker"); 
 imprimeDadosFila(f); 
 
 // Tenta adicionar Darth Vader, mas fila está cheia. 
 adicionaBoneco(f, "Darth Vader"); 
 imprimeDadosFila(f);
 // Remove todos da fila, um a um. 
 printf("\nRemovendo elementos da fila:\n"); 
 while ( queueRemove(f, &boneco) ) 
 { 
 printf("Elemento removido: '%s'\n", boneco); 
 imprimeDadosFila(f); 
 } 
 
 queueFree(f); //liberando memoria 
 return 0;
}
void imprimeDadosFila(QUEUE f) 
{ 
 char * primeiro; 
 if (queuePeek(f, &primeiro)) 
 { 
 printf("Primeiro da fila: %s\n", primeiro); 
 } 
 printf("Tamanho da fila: %d\n\n", queueSize(f));
} 
 
void adicionaBoneco(QUEUE f, char * boneco) 
{ 
 if (! queueAdd(f, &boneco)) 
 { 
 printf("ERRO: fila cheia. Nao adicionou: '%s'.\n", boneco); 
 } 
 else 
 { 
 printf("Boneco adicionado na fila: %s\n", boneco); 
 }
}
Estruturas de Dados 9
Lista
Usa a biblioteca list.h
#include "list.h"
Exemplo
#include <stdio.h>#include "list.h"void imprimirLista(LIST lista); //função auxiliar
int main() 
{ 
 LIST lista = listCreate(4, sizeof(char *)); //criação da lista, nessa biblioteca ela t
ambém é estática 
 char * e; //essa váriavel é para cada elemento inserido ou retirado 
 int tam; 
 int pos; 
 
 // Imprime a lista vazia! 
 imprimirLista(lista);
 // Adicionando primeiro elemento 
 
 e = "Arroz"; 
 if ( listAdd(lista, &e) != LIST_IS_FULL ) //função para adicionar elemento, se coloca
 o != LIST_IS_FULL para diferencia de quando não for possivel adicionar 
 { 
 printf("Elemento adicionado no final da lista: '%s'\n", e); 
 imprimirLista(lista); 
 } 
 else { 
 // erro: lista cheia! 
 } 
 
 // Adicionando segundo elemento 
 
 e = "Banana"; 
 tam = listAdd(lista, &e); //aqui é para atualizar o tamanho da lista 
 printf("Elemento adicionado no final da lista: '%s'\n", e); 
 printf("Lista agora tem %d elementos.\n", tam); 
 imprimirLista(lista);
 // Adicionando um elemento na posição 1. 
 // O elemento que estava nesta posição, foi para posição 2. 
 
 e = "Feijao"; 
 tam = listAddAtPosition(lista, &e, 1);
//se usa essa função quando se quer adicionar em uma posição especifica 
 switch(tam) //precisa fazer isso pois existe 3 opções que podem ocorrer 
 { 
 case LIST_IS_FULL: // erro: lista cheia 
 break; 
 case INVALID_POSITION: // erro: posição inválida. 
 break; 
 default: 
 printf("Elemento adicionado na posicao 1 da lista: '%s'\n", e); 
 printf("Lista agora tem %d elementos.\n", tam); 
 imprimirLista(lista); 
 break; 
Estruturas de Dados 10
 } 
 
 // Adiciona um elemento na posição 2. 
 // Banana que estava nesta posição, foi para posição 3. 
 
 e = "Macarrao"; 
 tam = listAddAtPosition(lista, &e, 2); 
 switch(tam) 
 { 
 case LIST_IS_FULL: // erro: lista cheia 
 break; 
 case INVALID_POSITION: // erro: posição inválida. 
 break; 
 default: 
 printf("Elemento adicionado na posicao 2 da lista: '%s'\n", e); 
 printf("Lista agora tem %d elementos.\n", tam); 
 imprimirLista(lista); 
 break; 
 }
 // Procura e remove o Feijão da lista 
 
 e = "Feijao"; 
 pos = listRemove(lista, &e); //função para remover elemento, ele funciona comparando o 
elemento com cada elemento da lista (byte com byte) 
 if (pos != NOT_FOUND) //serve para mostrar o elemento removido e a sua posição 
 { 
 printf("Elemento removido lista: '%s'\n", e); 
 printf("Posicao do elemento removido: %d.\n", pos); 
 imprimirLista(lista); 
 } 
 else 
 { 
 // Elemento não encontrado. 
 }
 e = "Arroz"; 
 pos = listGetPosition(lista, &e); 
 if (pos != NOT_FOUND) 
 { 
 printf("'%s' encontrado na posicao %d da lista.\n", e, pos); 
 } 
 else 
 { 
 // Elemento não encontrado. 
 }
 if (listGet(lista, &e, pos) != INVALID_POSITION) 
 { 
 printf("Elemento da posicao %d = '%s'\n", pos, e); 
 } 
 else { 
 // erro: posição definida em 'pos' é inválida! 
 }
 // Remove o elemento da posição 1. 
 tam = listRemoveAtPosition(lista, 2); 
 if (tam != INVALID_POSITION) 
 { 
 printf("\nElemento da posicao 2 foi removido!\n"); 
 } 
 else { 
Estruturas de Dados 11
 // Erro: posição inválida! 
 } 
 imprimirLista(lista); 
 
 listFree(lista); 
 return 0;
}
void imprimirLista(LIST lista) 
{ 
 int i; 
 int f = listSize(lista); //captura o tamanho da lista 
 printf("*** LISTA ***\n"); 
 for(i=0; i<f; i++) //esse for serve para percorre cada elemento da lista 
 { 
 char * e; 
 listGet(lista, &e, i); //para pegar o elemento da lista é necessário indicar a sua 
posição 
 printf("[%d]: %s\n", i, e); 
 } 
 printf("*************\n\n");
}

Continue navegando