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):
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):
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.


Cara, você recomenda no final “artigos”. Chegando lá ele se refere ao FIFO como pilha.
Boa tarde Rógeres.
Não havia percebido, vou falar com o autor do outro blog.
Abração e boa semana.
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.
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.
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…..??????????????????????????????????????????????????
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.
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 #
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.