Estrutura de dados - Pilhas

27.428 visualizações

Publicada em

Publicada em: Tecnologia
2 comentários
8 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
27.428
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
938
Comentários
2
Gostaram
8
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Estrutura de dados - Pilhas

  1. 1. Prof. Adriano Teixeira de Souza
  2. 2.  É uma das estruturas de dados mais simples A idéia fundamental da pilha é que todo o acesso a seus elementos é feito através do seu topo. Assim, quando um elemento novo é introduzido na pilha, passa a ser o elemento do topo, e o único elemento que pode ser removido da pilha é o do topo.
  3. 3.  Verificação de parênteses. Retirada de vagões de um trem. Retirada de mercadorias em um caminhão de entregas.
  4. 4.  Os elementos da pilha são retirados na ordem inversa à ordem em que foram introduzidos: o primeiro que sai é o último que entrou (LIFO – last in, first out). Existem duas operações básicas que devem ser implementadas numa estrutura de pilha: ◦ operação para empilhar (push) um novo elemento, inserindo-o no topo, ◦ operação para desempilhar (pop) um elemento, removendo-o do topo
  5. 5. push(b)push(a) b a topo x m k
  6. 6. topo b topo a atopo x x x m m m k push(a) k push(b) k
  7. 7. pop(b)pop(a) topo b a x m k
  8. 8. topo b a topo a topo x x x m m m k pop(b) k pop(a) k
  9. 9.  Supondo a pilha está armazenada em um vetor pilha[0..n-1]. A parte do vetor ocupada pela pilha será: 0 t n-1 pilha[0..n-1]
  10. 10. #define MAX 50typedef struct { int n; float vet[MAX];} Pilha;
  11. 11. Pilha* cria(void){ Pilha* p; p = (Pilha*) malloc(sizeof(Pilha)); p->n = 0;/*Inicializa com zero elementos*/ return p;} Prof. Adriano Teixeira de Souza
  12. 12. void push(Pilha* p, float v){ if(p->n==MAX){ printf("Capacidade da pilha estourou.n"); exit(1); /*aborta programa*/ } /* insere elemento na próxima posição livre */ p->vet[p->n] = v; p->n++;}
  13. 13. float pop(Pilha* p){ float v; if (vazia(p)) { printf("Pilha vazia.n"); exit(1); /*aborta programa*/ } /*retira elemento do topo*/ v = p->vet[p->n-1]; p->n--; return v;}
  14. 14. int vazia(Pilha* p){ return (p->n == 0);}
  15. 15. void libera(Pilha* p){ free(p);}
  16. 16. void imprime (Pilha* p) { int i; for (i=p->n-1; i>=0; i--) printf("%fn",p->vet[i]);} Prof. Adriano Teixeira de Souza
  17. 17. main(){ Pilha* p = cria(); push(p,20.0); push(p,20.8); push(p,20.3); push(p,44.5); push(p,33.3); push(p,20.9); imprime (p); printf ("Retirado: %4.2fn", pop(p)); printf ("Retirado: %4.2fn", pop(p)); printf ("Configuracao da fila:n"); imprime (p); libera (p); system("pause");} Prof. Adriano Teixeira de Souza
  18. 18.  Quando o número máximo de elementos que serão armazenados na pilha não é conhecido, devemos implementar a pilha usando uma estrutura de dados dinâmica, no caso, empregando uma lista encadeada. Os elementos são armazenados na lista e a pilha pode ser representada simplesmente por um ponteiro para o primeiro nó da lista.
  19. 19. typedef struct { float info; struct No* anterior;} No;typedef struct { No* topo;} Pilha;
  20. 20.  Criar uma estrutura de pilha; Inserir um elemento no topo (push); Remover o elemento do topo (pop); Verificar se a pilha está vazia; Liberar a estrutura de pilha
  21. 21. Pilha* cria(void){ Pilha *p; p = (Pilha*) malloc(sizeof(Pilha)); p->topo = NULL; return p;}
  22. 22. Pilha* push(Pilha *p, float v){ No* aux; aux = (No*) malloc(sizeof(No)); aux->info = v; aux->anterior = p->topo; p->topo = aux; return aux;}
  23. 23. float pop(Pilha *p){ float v; No* aux; if (vazia(p)) { printf(“Pilha vazia.”); exit(1); /*aborta o programa*/ } v = p->topo->info; aux = p->topo; p->topo = aux->anterior; free(aux); return v;}
  24. 24. int vazia(Pilha *p){ return (p->topo == NULL);}
  25. 25. void libera(Pilha *p){ No* q = p->topo; while (q != NULL) { No *t = q->anterior; free(q); q = t; } free(p);}
  26. 26. void imprime (Pilha* p) { No* q; for (q=p->topo; q!=NULL; q=q->anterior) printf("%4.2fn",q->info);} Prof. Adriano Teixeira de Souza
  27. 27. main(){ Pilha* p = cria(); push(p,20.0); push(p,20.8); push(p,20.3); push(p,44.5); push(p,33.3); push(p,20.9); imprime (p); printf ("Retirado: %4.2fn", pop(p)); printf ("Retirado: %4.2fn", pop(p)); printf ("Configuracao da fila:n"); imprime (p); libera (p); system("pause");} Prof. Adriano Teixeira de Souza
  28. 28.  Utilizando o algorítimo anteriormente apresentado implemente um programa que insira dados em uma pilha A e em seguida remova-os elementos da pilha A e insira-os na pilha B com sua ordem invertida. Prof. Adriano Teixeira de Souza

×