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);
}