Pilha estática
🔋 Declarando a pilha
#include<stdio.h>
#include<stdlib.h>
#define TAM 3
typedef struct{
int chave;
} REGISTRO;
typedef struct{
REGISTRO registros[TAM];
int topo;
} PILHA;
*️⃣ Funções de manipulação da pilha
Inicializar a pilha
O procedimento de inicialização da pilha consiste, basicamente, em atribuir o valor 0
à variável topo
da pilha. Esse processo de atribuição é necessário porque, ao instanciarmos uma pilha, o valor dessa variável será desconhecido (lembre-se que em C as variáveis não inicializadas possuem lixo de memória como valor).
O processo de inicialização garante que a pilha funcione de forma adequada, já que sua variável topo
terá o valor necessário para o funcionamento do algoritmo.
void inicializarPilha(PILHA *p){
p->topo = 0;
}
Inserir (ou empilhar)
A inserção de elementos numa pilha estática assume que a variável topo
representa a posição do vetor em que a inserção deve ser efetuada. Se a pilha estiver vazia, a inserção será na posição 0
. Se a pilha tiver um elemento, a inserção será na posição 1
do vetor.
Desse modo, deve-se observar se o valor da variável p->topo
é menor que a quantidade de itens da pilha. Isso acontece porque, se a pilha puder armazenar 3 elementos (#define TAM 3
), as posições válidas do vetor vão de 0
a 2
.
void inserir(PILHA *p, REGISTRO r){
if(p->topo < TAM){
p->registros[p->topo] = r;
p->topo++;
}
else{
printf("Pilha cheia!\n");
}
}
Remover (ou desempilhar)
A operação de remoção de um elemento da pilha estática é bastante simples: precisamos apenas verificar se a pilha possui ao menos um elemento. Em seguida, decrementamos o valor da variável topo
.
void remover(PILHA *p){
if(p->topo > 0){
p->topo--;
}
}
Imprimir
A impressão de uma pilha estática envolve o uso de um laço de repetição, como for
ou while
. A diferença é que, ao contrário do habitual, o laço deve iniciar no topo da pilha e iterar até o primeiro elemento da pilha, representado pelo índice 0
do vetor.
void imprimir(PILHA p){
for(int i = p.topo - 1; i >= 0; i--){
printf("%d\n", p.registros[i].chave);
}
}
🧑🏻💻 Testando a pilha
int main(void){
PILHA p;
inicializarPilha(&p);
inserir(&p, (REGISTRO){10});
inserir(&p, (REGISTRO){20});
inserir(&p, (REGISTRO){30});
inserir(&p, (REGISTRO){40});
remover(&p);
inserir(&p, (REGISTRO){40});
imprimir(p);
}