Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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

 

Link para o comentário
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
 

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!