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)); }
Ótimo vídeo, professor. Obrigado