DEV Community

Cover image for Estrutura de dados: Pilha dinâmica
Hector Fernandes
Hector Fernandes

Posted on

Estrutura de dados: Pilha dinâmica

Essa publicação serve como um resumo, para que eu possa consultar com facilidade, porém pode ser de grande ajuda aos iniciantes.

O que é uma pilha?

Pilha é uma estrutura de dado do tipo LIFO (last-in first-out), o que significa que o último elemento colocado, será o primeiro elemento a ser retirado. Portanto, uma pilha só permite interação com o elemento do topo.

Exemplo disso é a imagem da capa, onde para acessar a pedra do meio é necessário retirar as pedras acima, sempre começando do topo. Outro exemplo é o mecanismo de desfazer e refazer dos editores de texto.

Operações principais:

  • Criação da pilha (createStack)
  • Inserir elemento na pilha (push)
  • Remover elemento da pilha (pop)
  • Mostrar topo (showTop)
  • Imprimir pilha (printStack)

A pilha a ser desenvolvida, será uma pilha dinâmica na linguagem C.

  • Primeiro criamos a estrutura:
typedef struct stack{ int number; struct stack *next; }Stack; 
Enter fullscreen mode Exit fullscreen mode
  • Vamos criar a função que cria a pilha:
Stack **createStack(){ Stack **varStack = (Stack **)malloc(sizeof(Stack *)); if(varStack == NULL){ printf("\nERRO! Memoria insuficiente.\n"); exit(1); } *varStack = NULL; return varStack; } 
Enter fullscreen mode Exit fullscreen mode
  • Agora criaremos a função de inserir:
void push(Stack **varStack, int data){ Stack *elementStack = (Stack *)malloc(sizeof(Stack)); if(elementStack == NULL){ printf("\nERRO! Falta de memoria\n"); exit(1); } if(isEmpty(varStack)){ *varStack = elementStack; elementStack->number = data; elementStack->next = NULL; }else{ elementStack->next = *varStack; elementStack->number = data; *varStack = elementStack; } } 
Enter fullscreen mode Exit fullscreen mode
  • Agora a função de retirar o elemento:
int pop(Stack **varStack, int *data){ Stack *aux; if(!isEmpty(varStack)){ aux = *varStack; *varStack = aux->next; *data = aux->number; free(aux); return 1; } return 0; } 
Enter fullscreen mode Exit fullscreen mode
  • É necessário criar uma função que verifique se a pilha está vazia, então a criaremos:
int isEmpty(Stack **varStack){ if(varStack == NULL){ return 1; } if(*varStack == NULL){ return 1; } return 0; } 
Enter fullscreen mode Exit fullscreen mode
  • Para finalizar as operações principais, criaremos as funções que imprimem os elementos:
void showTop(Stack **varStack){ printf("\nTopo: %d\n", (*varStack)->number); } \\----------------------------------------------- void printStack(Stack **varStack){ if(varStack == NULL) return; Stack *aux = *varStack; printf("\n--------------\n"); while (aux != NULL){ printf("\n%d", aux->number); aux = aux->next; } printf("\n\n--------------\n"); } 
Enter fullscreen mode Exit fullscreen mode
  • Fora das operações principais temos duas funções que são usadas para liberar a pilha, já que é uma pilha dinâmica:
void stackFree(Stack **varStack){ if(varStack == NULL) return; elementFree(*varStack); free(varStack); } void elementFree(Stack *elementStack){ if(elementStack == NULL) return; elementFree(elementStack->next); free(elementStack); } 
Enter fullscreen mode Exit fullscreen mode
  • A função principal pode ser desenvolvida dessa forma:
int main(){ int op, data; Stack **varStack = createStack(); do{ printf("\n-----PILHA-----\n"); printf("\n1 - Adicionar elemento na pilha."); printf("\n2 - Remover elemento do topo."); printf("\n3 - Imprimir elemento do topo."); printf("\n4 - Imprimir pilha."); printf("\n0 - Sair"); printf("\nDigite: "); scanf("%d", &op); if(op == 1){ printf("\n\nInserir elemento na pilha."); printf("\nDigite o numero: "); scanf("%d", &data); push(varStack, data); }else if(op == 2){ if(pop(varStack, &data)){ printf("\nElemento %d retirado.\n", data); }else{ printf("\nA pilha esta vazia.\n"); } }else if(op == 3){ showTop(varStack); }else if(op == 4){ printStack(varStack); } } while (op != 0); stackFree(varStack); return 0; } 
Enter fullscreen mode Exit fullscreen mode

Com isso finalizamos esse post, espero ter ajudado.
O link para o código está aqui: clique aqui!

Top comments (0)