Entendendo Pilha e Fila

Entendendo Pilha e Fila

Olá Pessoal…

Hoje irei exemplificar Pilha e Fila (LIFO e FIFO respectivamente), utilizando a Linguagem C.


Bom pessoal, após exemplificar a Lista Encadeada Dinâmica, abaixo irei mostrar como fazer um programa em C que utilize FIFO e LIFO, mas o que significa essas siglas?… Simples, FIFO significa First In First Out (O primeiro a entrar é o primeiro a sair), e LIFO significa Last In First Out (O último a entrar é o primeiro sair), em português, esses conceitos são chamados de Pilha e Fila, a pilha é o LIFO, e a fila é o FIFO.

O funcionamento de ambas é simples, é usado uma lista encadeada com o uso de ponteiros, no caso da Pilha, sempre o último valor lido, ficará na ‘primeira’ posição da lista, dessa forma, quando for feita a exclusão, um auxiliar aponta para a próxima posição, e a posição atual, é excluída. Abaixo uma imagem que representa a Pilha (LIFO):

Representação de Pilha (LIFO)
Representação de Pilha (LIFO)

Agora no caso da Fila, o valor lido, sempre é passado para o começo, ou seja, esse valor aponta para as próximas posições, e quando for feita a exclusão, é só deletar esse valor do começo. Abaixo uma imagem que representa a Fila (FIFO):

Representação de Fila (FIFO)
Representação de Fila (FIFO)

Pilha (LIFO):

//LIFO
//Bibliotecas utilizadas
#include <stdio.h>
#include <stdlib.h>
 
//Se o sistema for Windows adiciona determinada biblioteca, e definindo comandos de limpar e esperar
#ifdef WIN32
    #include <windows.h>
    #define LIMPA_TELA system("cls")
//Senão for Windows (se for Linux)
#else
    #include <unistd.h>
    #define LIMPA_TELA system("/usr/bin/clear")
#endif
 
//Espera 3 segundos
#define ESPERA sleep(3)
 
//Estrutura da lista que será criada
typedef struct pilha {
    int valor;
    struct pilha *proximo;
} Dados;
 
void insere();
void exclui();
void mostra();
void mostra_erro();
 
//Inicializando os dados da lista
Dados *principal = NULL;
 
main(){
    char escolha;
    //Laço que irá mostrar o menu esperando uma opção (char)
    do {
        //Limpando a tela, e mostrando o menu
        LIMPA_TELA;
        printf("\nMétodo Pilha\n\n");
        printf("Escolha uma opção: \n");
        printf("\t1 - Inserir valor na Pilha\n");
        printf("\t2 - Remover valor da Pilha\n");
        printf("\t3 - Mostrar valores da Pilha\n");
        printf("\t9 - Sair\n\n");
        printf("Resposta: ");
        scanf("%c", &escolha);
        switch(escolha) {
            //Inserindo
            case '1':
                insere(); 
                break;
            //Excluindo
            case '2':
                if(principal!=NULL){
                    exclui();
                }
                else{
                    printf("\nA Pilha está vazia!\n");
                    getchar();
                }
                break;                
            //Mostrando
            case '3':
                if(principal!=NULL){
                    mostra();
                }
                else{
                    printf("\nA Pilha está vazia!\n");
                    getchar();
                }
                break;                
            case '9':
                printf("\nObrigado por utilizar esse programa!\n");
                printf("------>Terminal de Informação<------\n\n");
                ESPERA;
                exit(0);
                break;
            //Se foi algum valor inválido
            default:
                mostra_erro();
                break;
        }
        //Impedindo sujeira na gravação da escolha
        getchar();
    }
    while (escolha > 0); //Loop Infinito
}
 
//Inserção
void insere(){
    int val;
    LIMPA_TELA;
    printf("\nInserção: \n");
    printf("--------------------------------------\n");
    printf("Insira o valor a ser inserido: ");
    scanf("%d",&val);
    //gerando a posição atual
    Dados *atual = (Dados*)malloc(sizeof(Dados));
    atual -> valor = val;
    //próximo do atual será a principal
    atual -> proximo = principal;
    //principal volta a ser a atual
    principal = atual;
    printf("\nValor inserido!\n");
    printf("--------------------------------------");
    getchar();
}
 
//Exclusão
void exclui(){
    Dados *auxiliar;
    printf("\nExclusão: \n");
    printf("--------------------------------------\n");
    //guardando o valor depois da principal
    auxiliar=principal->proximo;
    //limpando a principal
    free(principal);
    //a principal será a auxiliar
    principal=auxiliar;
    printf("\nValor excluido!\n");
    printf("--------------------------------------");
    getchar();
}
 
//Mostrando
void mostra(){
    int posicao=0;
    Dados *nova=principal;
    LIMPA_TELA;
    printf("\nMostrando valores: \n");
    printf("--------------------------------------\n");
    //laço de repetição para mostrar os dados
    for (; nova != NULL; nova = nova->proximo) {
        posicao++;
        printf("Posição %d, contém o valor %d\n", posicao, nova->valor);
    }
    printf("--------------------------------------");
    getchar();
}
 
//Mostra erro de digitação
void mostra_erro(){
    LIMPA_TELA;
    printf("\nErro de Digitação: \n");
    printf("--------------------------------------\n");
    printf("\nDigite uma opção válida (pressione -Enter- p/ continuar)!\n\n");
    printf("--------------------------------------");
    getchar();
}

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/Linguagem_C.


Fila (FIFO):

//FIFO
//Bibliotecas utilizadas
#include <stdio.h>
#include <stdlib.h>
 
//Se o sistema for Windows adiciona determinada biblioteca, e definindo comandos de limpar e esperar
#ifdef WIN32
    #include <windows.h>
    #define LIMPA_TELA system("cls")
//Senão for Windows (se for Linux)
#else
    #include <unistd.h>
    #define LIMPA_TELA system("/usr/bin/clear")
#endif
 
//Espera 3 segundos
#define ESPERA sleep(3)
 
//Estrutura da lista que será criada
typedef struct Fila {
    int valor;
    struct Fila *proximo;
} Dados;
 
void insere();
void exclui();
void mostra();
void mostra_erro();
 
//Inicializando os dados da lista
Dados *principal = NULL;
Dados *final = NULL;
 
main(){
    char escolha;
    //Laço que irá mostrar o menu esperando uma opção (char)
    do {
        //Limpando a tela, e mostrando o menu
        LIMPA_TELA;
        printf("\nMétodo Fila\n\n");
        printf("Escolha uma opção: \n");
        printf("\t1 - Inserir valor na Fila\n");
        printf("\t2 - Remover valor da Fila\n");
        printf("\t3 - Mostrar valores da Fila\n");
        printf("\t9 - Sair\n\n");
        printf("Resposta: ");
        scanf("%c", &escolha);
        switch(escolha) {
            //Inserindo
            case '1':
                insere(); 
                break;
            //Excluindo
            case '2':
                if(principal!=NULL){
                    exclui();
                }
                else{
                    printf("\nA Fila está vazia!\n");
                    getchar();
                }
                break;                
            //Mostrando
            case '3':
                if(principal!=NULL){
                    mostra();
                }
                else{
                    printf("\nA Fila está vazia!\n");
                    getchar();
                }
                break;                
            case '9':
                printf("\nObrigado por utilizar esse programa!\n");
                printf("------>Terminal de Informação<------\n\n");
                ESPERA;
                exit(0);
                break;
            //Se foi algum valor inválido
            default:
                mostra_erro();
                break;
        }
        //Impedindo sujeira na gravação da escolha
        getchar();
    }
    while (escolha > 0); //Loop Infinito
}
 
//Inserção
void insere(){
    int val;
    LIMPA_TELA;
    printf("\nInserção: \n");
    printf("--------------------------------------\n");
    printf("Insira o valor a ser inserido: ");
    scanf("%d",&val);
    Dados *atual = (Dados*)malloc(sizeof(Dados));
    atual -> valor = val;
    atual -> proximo = NULL;
 
    //se o principal estiver vazio, será o atual
    if(principal == NULL){
        principal = final = atual;
    }
    //senão, o próximo valor que será o atual
    else{
        final->proximo=atual;
        final=atual;
    }
 
    printf("\nValor inserido!\n");
    printf("--------------------------------------");
    getchar();
}
 
//Exclusão
void exclui(){
    Dados *auxiliar;
    printf("\nExclusão: \n");
    printf("--------------------------------------\n");
    //o auxiliar será o próximo da principal
    auxiliar=principal->proximo;
    //limpando a principal
    free(principal);
    //a principal será a auxiliar
    principal=auxiliar;
    printf("\nValor excluido!\n");
    printf("--------------------------------------");
    getchar();
}
 
//Mostrando
void mostra(){
    int posicao=0;
    Dados *nova=principal;
    LIMPA_TELA;
    printf("\nMostrando valores: \n");
    printf("--------------------------------------\n");
    //laço de repetição para mostrar os valores
    for (; nova != NULL; nova = nova->proximo) {
        posicao++;
        printf("Posição %d, contém o valor %d\n", posicao, nova->valor);
    }
    printf("--------------------------------------");
    getchar();
}
 
//Mostrando erro de digitação
void mostra_erro(){
    LIMPA_TELA;
    printf("\nErro de Digitação: \n");
    printf("--------------------------------------\n");
    printf("\nDigite uma opção válida (pressione -Enter- p/ continuar)!\n\n");
    printf("--------------------------------------");
    getchar();
}

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/Linguagem_C.

Para quem quiser ler mais sobre o assunto, recomendo dois artigos do nosso parceiro Gabriel Arroyo:
Estrutura de Dados – Fila (FIFO)
Estrutura de Dados – Pilha

Download do código fonte:
Download pelo OneDrive
Ou
Download pelo 4Shared

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

4 comentários em “Entendendo Pilha e Fila

    1. Boa noite Roberto, tudo bem?
      Se for apenas para estudo, utilize uma fila simples mesmo, agora se quiser fazer algo profissional, talvez terá de envolver banco de dados e registros.
      Eu recomendo você pegar um molde de fila, e adequar talvez com árvore binária.
      Abraços.

Deixe uma resposta

%d blogueiros gostam disto: