aula 229

Como simular a recursão com uma estrutura de dados PILHA?

Dando continuidade ao nosso Curso de Programação C, vamos ver uma aplicação da estrutura pilha. Vamos ver nesta aula como simular a recursão com uma estrutura de dados PILHA.

O fatorial é por definição recursivo, como vimos na aula 155. Contudo, é possível calcular o fatorial de um número n sem utilizar recursão. Neste exercício vamos utilizar uma pilha. A ideia é, enquanto n for maior que 1, vamos empilhar o valor de n e subtrair 1.

Imagine que n seja 3, vamos empilhar o 3 e depois o 2. Neste momento, como n vale 1 e sabemos o fatorial de 1, iniciamos o processo inverso, desempilhando e multiplicando. Quando a pilha estiver vazia teremos o fatorial de n. A função abaixo calcula e retorna o fatorial de um número exatamente com esta lógica. Perceba que a nossa estrutura pilha está dentro da função fatorial e não mais na função main.

/*
   função para calcular o fatorial por meio de uma pilha
*/
int fatorial(int num){
    No *remover, *pilha = NULL;

    while(num > 1){
        pilha = empilhar(pilha, num);
        num--;
    }
    // aqui num vale 1
    imprimir(pilha);

    while(pilha){
        remover = desempilhar(&pilha);
        num = num * remover->valor;
        free(remover);
    }
    return num;
}

Código completo em C para calcular o fatorial de um número com uma estrutura de dados pilha

/*
            Aula 229: Como simular a recursão do fatorial com uma pilha?

            Código escrito por Wagner Gaspar
            Julho de 2021
*/

typedef struct no{
    int valor;
    struct no *proximo;
}No;

No* empilhar(No *pilha, int num){
    No *novo = malloc(sizeof(No));

    if(novo){
        novo->valor = num;
        novo->proximo = pilha;
        return novo;
    }
    else
        printf("Erro ao alocar memoria!\n");
    return NULL;
}

No* desempilhar(No **pilha){
    No *remover = NULL;

    if(*pilha){
        remover = *pilha;
        *pilha = remover->proximo;
    }
    else
        printf("Pilha vazia!\n");
    return remover;
}

void imprimir(No *pilha){
    printf("\n\tPILHA\n");
    while(pilha){
        printf("\t%d\n", pilha->valor);
        pilha = pilha->proximo;
    }
    printf("\n");
}

// função para calcular o fatorial por meio de uma pilha
int fatorial(int num){
    No *remover, *pilha = NULL;

    while(num > 1){
        pilha = empilhar(pilha, num);
        num--;
    }

    imprimir(pilha);

    while(pilha){
        remover = desempilhar(&pilha);
        num = num * remover->valor;
        free(remover);
    }
    return num;
}

int main(){
    int valor;

    printf("Digite um valor maior que zero para o fatorial: ");
    scanf("%d", &valor);
    printf("\tFatorial de %d: %d\n", valor, fatorial(valor));

}

Deixe um comentário

17 + dezoito =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.