Estruturas
Pilha dinâmica
Entenda o mecanismo de implementação de pilhas com alocação dinâmica
Como visto na página sobre pilha estática, pilhas são estruturas de dados que adotam a política LIFO (Last in, first out). Assim, as operações de remoção e inserção acontecem em um único ponto: o topo da pilha.
Enquanto a implementação estática da pilha ocorre em um vetor, a implementação dinâmica tem como principal vantagem a possibilidade de se alocar mais memória em tempo de execução - e de liberar memória, se for necessário.
🔋 Declarando a pilha dinâmica
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct{
int chave;
} REGISTRO;
typedef struct item{
struct item *ant;
REGISTRO r;
} ITEM;
typedef struct{
ITEM* topo;
} PILHADINAMICA;
*️⃣ Funções de manipulação da pilha
Inicializar a pilha
void inicializar(PILHADINAMICA *p){
p->topo = NULL;
}
A variável topo recebe o valor NULL por ser tratar de um ponteiro. Já a variável tam recebe o valor 0.
Inserir (ou empilhar)
ITEM* criarItem(REGISTRO r){
ITEM* novo = (ITEM*)calloc(1,sizeof(ITEM));
if(novo){
novo->r = r;
novo->ant = NULL;
}
return novo;
}
void empilhar(PILHADINAMICA *p, REGISTRO r){
ITEM* novo = criarItem(r);
if(!novo) return;
novo->ant = p->topo;
p->topo = novo;
}
Remover (ou desempilhar)
ITEM* desempilhar(PILHADINAMICA *p){
if(p->topo){
ITEM *exc = p->topo;
p->topo = p->topo->ant;
return exc;
}
return NULL;
}
Imprimir
void imprimir(PILHADINAMICA *p){
ITEM *aux = p->topo;
while(aux){
printf("%d\n", aux->r.chave);
aux = aux->ant;
}
}
Liberar a pilha
void liberarPilha(PILHADINAMICA *p){
ITEM *aux = p->topo;
while(aux){
ITEM* exc = aux;
aux = aux->ant;
free(exc);
}
p->topo = NULL;
}
🧑🏻💻 Testando a pilha
int main(void){
PILHADINAMICA d;
inicializar(&d);
empilhar(&d, (REGISTRO){10});
empilhar(&d, (REGISTRO){20});
empilhar(&d, (REGISTRO){30});
ITEM *i = desempilhar(&d);
if(i) {
printf("Removido: %d\n", i->r.chave);
free(i);
}
empilhar(&d, (REGISTRO){40});
imprimir(&d);
liberarPilha(&d);
}