Ir para conteúdo
Fórum Script Brasil
  • 0

Desempilhar Pilha pela Base.


LucasDuarte

Pergunta

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

1 resposta a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...