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



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


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

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

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

8 Responses

  1. Cara, você recomenda no final “artigos”. Chegando lá ele se refere ao FIFO como pilha.

  2. Boa tarde, preciso de um programa de controle e entrada em fila. Como o da Elite Active. É modelo de uma piramide, lá do zero., porem em fila classificatória.

    • Dan_Atilio disse:

      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.

  3. Boa tarde preciso de uma sugestão; no mundo da computação a onde podemos aplicar as Listas, Pilha, fila, arvore Abb, arvore Avl, arvore B…..??????????????????????????????????????????????????

    • Dan_Atilio disse:

      Boa noite Sandro.
      Olha, você poderia aplicar listas e pilha, em uma ordenação de produtos por exemplo, com cálculos de saída e entrada de estoque.
      Árvores binárias você poderia criar mapas de jogos por exemplo.
      Um grande abraço.

  4. noberto disse:

    como faço para controlar entrada e saida de veiculos ninha Oficina. tipo o carro AAAA-0000 vai fazer revisão de motor .suspenso e manutenção. utilizando a linguagem c #

    • Dan_Atilio disse:

      Boa noite Noberto, tudo bem?
      Você pretende criar um sistema do zero? Se sim, talvez seria legal fazer um em Java ou C#, com integração com banco de dados.
      Esse artigo é sobre Linguagem C, nela seria um pouco mais complicado desenvolver algo desse tipo.
      O que recomendo, é primeiro desenhar toda a lógica do processo, para depois passar para um banco de dados e para uma linguagem de programação.
      Qualquer dúvida, fico à disposição.
      Abraços.

Deixe uma resposta para Dan_AtilioCancelar resposta

Terminal de Informação