Ir ao conteúdo
  • Cadastre-se

Desempilhar Pilha pela Base.


HeadCrrusher

Posts recomendados

Olá! Fiz uma pilha que cumpre a sua função Desempilhar normalmente, de cima para baixo.
 
Agora estou tentando desempilhar essa mesma pilha só que de Baixo para Cima mas estou com dificuldades e gostaria da ajuda dos senhores.
 
Agradeço desde já!
 
Segue o Código:
 
#include <stdio.h>#include <stdlib.h>struct Item{    int numero;    struct Item *proximo;};void Inicializar(Item **topo){   *topo = NULL;}bool EstaVazia(Item **topo){   if(*topo == NULL)      return true;   else      return false;}void Empilhar(Item **topo, int elemento){    Item *novo;    novo = (Item *)malloc(sizeof(Item));    novo->numero = elemento;    novo->proximo = *topo; // -> próximo recebe o elemento que estava no topo.    *topo = novo;}int Desempilhar(Item **topo){   int result;   Item *auxiliar;   if(EstaVazia(topo))   {        printf("\n stack underflow! \n");        exit(1);   }   else // -> Elemento retirado do topo   {        result = (*topo)->numero;        auxiliar = *topo;        *topo = (*topo)->proximo;        free(auxiliar);        return result;   }}void MostrarPilha(Item *topo){    int i = 0;    Item *item;    printf("\n\n Listando...\n\n");    printf("---------------------------------\n");    if (EstaVazia(&topo))    {        printf ("A Pilha esta vazia!\n");    }    else    {        item = topo;        while(item != NULL)        {            i++;            printf("[%i] -> %i\n", i, item->numero);            item = item->proximo;        }    }    printf("---------------------------------\n");}void Menu(){    printf( "\n\nDigite a sua escolha: \n"        "    1 empilhar elemento \n"        "    2 desempilhar \n"        "    3 para finalizar \n"        "? ");}main(){    Item *topo = NULL;    int opcao;    int numero;    Menu();    scanf("%i", &opcao);    while (opcao != 3)    {        switch (opcao)        {            case 1:                printf( "Digite um numero: ");                scanf("\n%i", &numero);                Empilhar(&topo, numero);                MostrarPilha(topo);                break;            case 2:                numero = Desempilhar(&topo);                printf( "\n Numero desempilhado: %d \n",numero);                MostrarPilha(topo);                break;            default:                printf( "Escolha invalida.\n\n");                break;        }        Menu();        scanf("%i", &opcao);    }    system("pause");}

 

Link para o comentário
Compartilhar em outros sites

int DesempilharInversamente(Item **topo){   Item* it = NULL;   Item* auxiliar = NULL;   int result = -1;   for (it = (*topo); it->proximo != NULL; it = it->proximo)        if (it->proximo->proximo == NULL)            break;   auxiliar = it->proximo;   if (auxiliar)   {      result = it->proximo->numero;      it->proximo = NULL;      free(auxiliar);   }   else   {      result = it->numero;      free(it);   }   return result;}

Taí uma solução não testada..

Parabéns pelo seu código! Muito bem indentado e programado!

Link para o comentário
Compartilhar em outros sites

Olá, novamente!

 

Amigo, gostaria de agradecer você pois o seu código funcionou muito bem!!! Foi de enorme ajuda!

 

Está sem nenhum erro porém, quando chega a hora de retirar o último número da pilha, o mesmo não é retirado. 

 

Será que você pode me ajudar mais um pouco?!  :confused:

 

Segue uma foto:

 

shYHvse.jpg

 

 

Eu escolho a opção 3, ele desempilha de baixo para cima corretamente, mas quando chega no último número (no topo; no caso da foto, o 50) ele não elimina o número e exibe a "Pilha está vazia!", além de continuar exibindo em cima o "Numero desempilhado: 50".

Fico no aguardo, enquanto isso vou tentando aqui.

 

Mais uma vez, obrigado!

Link para o comentário
Compartilhar em outros sites


int DesempilharInversamente(Item **topo)

{

Item* it = NULL;

Item* auxiliar = NULL;

int result = -1;

for (it = (*topo); it->proximo != NULL; it = it->proximo)

if (it->proximo->proximo == NULL)

break;

auxiliar = it->proximo;

if (auxiliar)

{

result = it->proximo->numero;

it->proximo = NULL;

free(auxiliar);

}

else

{

result = it->numero;

free(it);

*topo = NULL;//INSIRA ESTE CÓDIGO E TESTE AGORA

}

return result;

}

Link para o comentário
Compartilhar em outros sites

Infelizmente essa linha de código não serviu.

 

Mas testando aqui notei que quando sobra esse último Número, eu consigo tirá-lo da pilha normalmente executando a opção número 2 (o Desempilhar normal). 

 

Será que não falta algum tipo de referência no DesempilharInversamente para esse último número para ele ser apagado?

Link para o comentário
Compartilhar em outros sites

int DesempilharInversamente(Item **topo){   Item* it = NULL;   Item* auxiliar = NULL;   int result = -1;   for (it = (*topo); it->proximo != NULL; it = it->proximo)        if (it->proximo->proximo == NULL)            break;   auxiliar = it->proximo;   if (auxiliar)   {      result = it->proximo->numero;      it->proximo = NULL;      free(auxiliar);   }   else   {      result = it->numero;      free(it);      *topo = NULL;//Essa linha aqui!!!   }   return result;}

testei este código e deu certo agora!

Link para o comentário
Compartilhar em outros sites

Isso! It's alive!  :P  Funcionou, cara! Muito obrigado novamente!

 

Vou deixar aqui o código completo pra ajudar futuras pessoas que tenham a mesma dúvida:

 

#include <stdio.h>#include <stdlib.h>struct Item{    int numero;    struct Item *proximo;};void Inicializar(Item **topo){   *topo = NULL;}bool EstaVazia(Item **topo){   if(*topo == NULL)      return true;   else      return false;}void Empilhar(Item **topo, int elemento){    Item *novo;    novo = (Item *)malloc(sizeof(Item));    novo->numero = elemento;    novo->proximo = *topo; // -> próximo recebe o elemento que estava no topo. NA topo    *topo = novo;}int Desempilhar(Item **topo){   int result;   Item *auxiliar;   if(EstaVazia(topo))   {        printf("\n stack underflow! \n");        exit(1);   }   else   {    result = (*topo)->numero;    auxiliar = *topo;    *topo = (*topo)->proximo;    free(auxiliar);    return result;   }}int DesempilharInversamente(Item **topo){   Item* it = NULL;   Item* auxiliar = NULL;   int result = -1;   for (it = (*topo); it->proximo != NULL; it = it->proximo)        if (it->proximo->proximo == NULL)            break;   auxiliar = it->proximo;   if (auxiliar)   {      result = it->proximo->numero;      it->proximo = NULL;      free(auxiliar);   }   else   {      result = it->numero;      free(it);      *topo = NULL;   }   return result;}void MostrarPilha(Item *topo){    int i = 0;    Item *item;    printf("\n\n Listando...\n\n");    printf("---------------------------------\n");    if (EstaVazia(&topo))    {        printf ("A Pilha esta vazia!\n");    }    else    {        item = topo;        while(item != NULL)        {            i++;            printf("[%i] -> %i\n", i, item->numero);            item = item->proximo;        }    }    printf("---------------------------------\n");}void Menu(){    printf( "\n\nDigite a sua escolha: \n"        "    1 empilhar elemento \n"        "    2 desempilhar \n"        "    3 desempilhar Inversamente \n"        "    4 para finalizar \n"        "? ");}main(){    Item *topo = NULL;    int opcao;    int numero;    Menu();    scanf("%i", &opcao);    while (opcao != 4)    {        switch (opcao)        {            case 1:                printf( "Digite um numero: ");                scanf("\n%i", &numero);                Empilhar(&topo, numero);                MostrarPilha(topo);                break;            case 2:                numero = Desempilhar(&topo);                printf( "\n Numero desempilhado: %d \n",numero);                MostrarPilha(topo);                break;            case 3:numero = DesempilharInversamente(&topo);printf( "\n Numero desempilhado: %d \n",numero);                MostrarPilha(topo);break;            default:                printf( "Escolha invalida.\n\n");                break;        }        Menu();        scanf("%i", &opcao);    }    system("pause");}

Mais uma vez, obrigado @Nayuugga pela sua ajuda e tempo! 

 

Abraços!

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