120 likes | 234 Views
Estrutura de dados II. Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação. Pilhas com alocação dinâmica de memória. Operações. Não existe o teste de Pilha Cheia Na Implementação do TAD Pilha com alocação Dinâmica não temos limite de espaço.
E N D
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Operações • Não existe o teste de Pilha Cheia • Na Implementação do TAD Pilha com alocação Dinâmica não temos limite de espaço. • Assim as operações da pilha são as seguinte: • inicializaPilha • pilhaVazia • empilha • desempilha
Estrutura de dados: typedefintElemento; // tipo a ser armazenado typedefstruct nodo { Elementoitem; struct nodo *prox; }* Nodo; typedefstruct { Nodotopo; }Pilha;
Pré e pos condicoes • Inicializa • Pre-condições: Não há • Pós-condições: topo aponta para NULL • Empilha(elemento): • Pré-condições: não há • Pós-condições: topo aponta para novo nodo contendo o elemento. Prox de topo aponta para o topo anterior • Desempilha • Précondições: pilhaVazia = FALSO • Pós-condições: remove o nodo do topo. Topo aponta para o próximo de topo.
Operações voidinicializaPilha(Pilha *); intpilhaVazia(Pilha); voidempilha (Pilha *, Elemento); intdesempilha (Pilha * Elemento *); ElementomostraTopo(Pilha);
PilhaAD.h completo /* * Interface do Tad PilhaAD* */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MSG_PILHAVAZIA "\nA Pilha está vazia\n" #define MAX 10 // tamanho máximo da Pilha #define TRUE 1 #define FALSE 0 typedefintElemento; // tipo a ser armazenado typedefstruct nodo { Elementoitem; struct nodo *prox; }* Nodo;
PilhaAD.h completo - continuação typedefstruct { Nodotopo; }Pilha; intpilhaVazia(Pilha); voidinicializaPilha(Pilha *); voidempilha (Pilha *, Elemento); intdesempilha (Pilha * Elemento *); ElementomostraTopo(Pilha);
Implementação das Operações voidinicializaPilha(Pilha *p) { p->topo=NULL; } intpilhaVazia(Pilha p){ return (p.topo==NULL); } voidempilha (Pilha *p, Elemento ele){ Nodo novoNodo; novoNodo = (struct nodo *) malloc(sizeof(struct nodo)); novoNodo->item=ele; novoNodo->prox=p->topo; p->topo=novoNodo; }
Empilhando elementos 4 2 3 topo Inicializa pilha apontando topo para null 1 Pilha Inicializa(&p) 7 5 NULL 6 topo Item Prox Item Prox Pilha Nodo Nodo Alocado no endereco 0xffde Alocado no endereco 0xffcc 0xffcc empilha(5,&p) NULL 8 0xffcc 5 NULL topo Pilha Aloca espaco para Nodo em um endereco de memória Aloca espaco para Nodo em um endereco de memória 0xffde empilha(8,&p) 0xffcc Faz topo apontar para endereco onde Nodo foi alocado Faz topo apontar para endereco onde Nodo foi alocado Faz Prox receber valor de topo da pilha Faz Prox receber valor de topo da pilha A pilha agora possui dois valores 8 5 Topo
Implementação das Operações int desempilha(Pilha *p) { Elemento eleNodo aux; if (pilhaVazia(*p)==FALSE) { ele = p->topo->item; aux = p->topo; p->topo = p->topo->prox; free(aux); } else{ fprintf(stderr, MSG_PILHAVAZIA); } return ele; }
Testando o tadPilha (principal.c) intmain(){ Pilha p; int i; Elemento e; inicializaPilha(&p); for(i=0;i<10;i++) { empilha(&p,i); } while(pilhaVazia(p)==FALSE){ e = desempilha(&p); printf("%d\n",e); } fprintf(stderr,"Terminou ok.\n"); return 0; }