Ir ao conteúdo
  • Cadastre-se
Mario Schoffel

Como manipular fila para pilha e vice-versa em c?

Recommended Posts

olá pessoal...Quem poderá me salvar...sou leigo em programação em c ainda e estou com esse problema...Até então fiz este código que está funcionando bem...o problema é que preciso fazer com que os valores digitados na "fila" passem para a "pilha" e depois os mesmos valores voltem para a fila formando assim uma fila invertida daquela que existia no começo...resumindo, quando for excluído da fila este valor deve ir para a pilha, e depois que a pilha estiver com todos os valores que estavam na fila, quando excluir da pilha este valor deve voltar para a fila... será que alguém consegue resolver isso? Fico grato com a ajuda desde já.

 

 

‪# include <stdio.h>
#include <stdlib.h> 
#include <locale.h>

//Constantes
‪# define tamanho 5
#define ta 5
//Estrutura da Fila
struct tfila {
int dados[tamanho];
int ini;
int fim;
}; 
//Estrutura da Pilha
struct tpilha {
int dado[ta];
int inicio;
int final;
};
//Variáveis globais
struct tfila fila;
struct tpilha pilha;
int op;
//Protipação
void fila_entrar();
void fila_sair();
void fila_mostrar();
void menu_mostrar();
void pilha_entrar();
void pilha_sair();
void pilha_mostrar();
void men_mostrar();
//Função principal
int main(){
setlocale(LC_ALL, "Portuguese");
op = 1;
fila.ini = 0;
fila.fim = 0;
pilha.inicio = 0;
pilha.final = 0;
while (op != 0) {
system("cls");
fila_mostrar();
menu_mostrar();
pilha_mostrar();
men_mostrar();
scanf("%d", &op);
switch (op) {
case 1:
fila_entrar();
break;
case 2:
fila_sair();
break;
case 3:
pilha_entrar();
break;
case 4: 
pilha_sair();
break;
}
}
return(0);
}
//Adicionar um elemento no final da Fila
void fila_entrar(){
if (fila.fim == tamanho) {
printf("\nA fila está cheia, impossível adicionar um novo valor!\n\n");
system("pause");
}
else {
printf("\nDigite o valor a ser inserido: ");
scanf("%d", &fila.dados[fila.fim]);
fila.fim++;
}
} 
//Adicionar um elemento no final da Pilha
void pilha_entrar(){
if (pilha.final == ta) {
printf("\nA pilha está cheia, impossível empilhar um novo elemento!\n\n");
system("pause");
}
else {
printf("\nDigite o valor a ser empilhado: ");
scanf("%d", &pilha.dado[pilha.final]);
pilha.final++;
}
}
//Retirar o primeiro elemento da Fila
void fila_sair() {
if (fila.ini == fila.fim) {
printf("\nA fila está vazia, não há nada para remover!\n\n");
system("pause");
}
else {
int i;
for (i = 0; i < tamanho; i++) {
fila.dados = fila.dados[i+1];
}
fila.dados[fila.fim] = 0;
fila.fim--;
}
}
//Retirar o último elemento da Pilha
void pilha_sair() {
if (pilha.inicio == pilha.final) {
printf("\nA pilha está vazia, não há nada para desempilhar!\n\n");
system("pause");
}
else {
pilha.dado[pilha.final-1] = 0;
pilha.final--;
}
}
//Mostrar o conteúdo da Fila
void fila_mostrar() {
int i;
printf("[ ");
for (i = 0; i < tamanho; i++) {
printf("%d ", fila.dados);
}
printf("]\n\n");
}
//Mostrar o conteúdo da Pilha
void pilha_mostrar() {
int j;
printf("[ ");
for (j = 0; j < ta; j++) {
printf("%d ", pilha.dado[j]);
}
printf("]\n\n");
} 
//Mostrar o menu de opções
void menu_mostrar() {
printf("\nEscolha uma opção:\n");
printf("1 - Incluir na Fila\n");
printf("2 - Excluir da Fila\n");
printf("0 - Sair\n\n");
} 
//Mostrar o menu de opções
void men_mostrar() {
printf("\nEscolha uma opção:\n");
printf("3 - Empilhar\n");
printf("4 - Desempilhar\n");
printf("0 - Sair\n\n");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mario Schoffel Não tem muito segredo, supondo que sua fila receba no rabo e puxe da cabeça, você descarrega a fila na pilha e depois descarrega a pilha na fila e estará invertido. É bom você criar uma função para chegar se a pilha está vazia, e outra pra checar se a fila esta vazia.

enquanto a fila não estiver vazia
  tira da fila e insere na pilha
fim_enquanto

enquanto a pilha não estiver vazia
  tira da pilha e insere na fila
fim_enquanto
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Mario Schoffel O ideal é que você crie uma função que remove da pilha/fila já retornando o elemento que foi removido, algo como:

int pilha_remove(); // remove o elemento do topo! Topo da pilha e retorna ele
int fila_remove(); // remove o elemento dda cabeça da fila e retorna ele

E também é muito importante que você tenha funções que verifiquem se a pilha/fila está vazia. EX:

int pilha_vazia(); // retorna 1 caso a pilha esteja vazia, senão retorna 0;

Pra que isso? pra utilizar a pilha/fila mais facilmente:

while( fila_vazia() == 0 ) //Enquanto a fila não estiver vazia
{
  insere_pilha( remove_fila() ); //aqui remove da fila e o retorno da remoção é utilizado pra inserir na pilha
}

while( pilha_vazia() == 0 ) //Enquanto a pilha não estiver vazia
{
  insere_fila( remove_pilha() ); //aqui remove da pilha e o retorno da remoção é utilizado pra inserir na fila
}


pronto, com isso você inverte sua fila.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×