Jump to content
Fórum Script Brasil
  • 0

Desempilhar Pilha pela Base.


LucasDuarte

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Sem tornar a lista simplesmente ligada em uma duplamente ligada essa operação é "complicada", ao menos em termos de performance.
A lista precisa ser simplesmente ligada? (não possuir ponteiro para o elemento anterior, apenas para o próximo)

Abraços.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...