Uma implementação de pilha

Uma implementação de pilha

por José Coelho de Pina -
Número de respostas: 4

Ois,

O que você acham da implementação a seguir de um pilha de objetos de tipo Item através de uma lista encadeada com cabeça?
Tendo em vista como foi implementada a operação empilhar (stachPush()) como deve ser feita a operação desempilhar (stackPop())?

/*
 * PILHA: uma implementacao com lista encadeada com cabeca
 */
typedef struct stackNode* Link;
struct stackNode { 
    Item conteudo; 
    Link prox; 
};

static Link topo;

static void *mallocSafe (unsigned int n);

void 
stackInit(int n)
{ 
    topo = (Link) mallocSafe(sizeof *topo);
    topo->prox = NULL;
    topo->contedo = LIXO;
}

int 
stackEmpty()
{ 
    return topo->prox == NULL; 
}

void 
stackPush(Item item)
{ 
    Link p;
    Link nova = (Link) mallocSafe(sizeof *nova);
    nova->conteudo = item;
    nova->prox = NULL;

    for (p = topo; p->prox; p = p->prox);

    p->prox = nova;
}

Item 
stackPop()
{ 
    /* Completar */
}

Item
stackTop()
{
    link p;

    /* e discutivel se devemos ou nao fazer o teste a seguir */
    if (topo->prox == NULL) /* stackempty() */
    { 
	printf("Putz, nao sei o que estou fazendo!\n");
	exit(EXIT_FAILURE);
    }

    for (p = topo; p->prox; p = p->prox);

    return  p->conteudo;
}

void 
stackFree()
{
    while (topo != NULL) 
    {
	Link p = topo;
	topo = topo->prox;
	free(p);
    }
}
Em resposta à José Coelho de Pina

Re: Uma implementação de pilha

por João Henrique Luciano -

Antes, uma pergunta: a condição "p->prox" do "for" na stackPush significa "p->prox!=NULL"?

Em resposta à José Coelho de Pina

Re: Uma implementação de pilha

por Lucas Silva -

Vendo a StackTop e a StackPush, me parece que na stackPop devemos fazer  algo do tipo:

Item stackPop(){

       Link p, morta;

        Item conteudo;

       for( p = topo;  p->prox->prox;  p = p->prox);

      morta = p->prox;

     conteudo = morta->conteudo;

      p->prox = NULL;

       free(morta);

       return conteudo;

}

Fiz um esquema bem besta no papel, então não sei se é isso mesmo mostrando a língua