/*! * \file pilha.c * Todas as definições da pilha estao neste módulo. * * \brief Módulo gerenciador da pilha. * \version 0.0.1 * \date 04/27/2012 10:51:51 AM * \author Alessandro Elias, ae11@inf.ufpr.br * \author Welton Pereira Martins, wpm11@inf.ufpr.br */ #include #include #include #include #include "pilha.h" #include "mydebug.h" #include "log.h" /* _____________________________________________________________________________________ */ /*! * \brief Inicializa a pilha. * \param pPilha - ponteiro para a pilha. * \return TRUE em caso a inicialização foi bem sucedida, * FALSE caso contrário. * \remark InicPilha deve ser a primeria função a ser chamada, caso * ocorra uma chamada a qualquer uma das outra funções o resultado * e imprevisível, pois a pilha contem lixo de memória. * \sa Push, Pop, VaziaPilha, TamanhoPilha, ImprimePilha ****************************************************************************************/ bool InicPilha(struct TipoPilha *pPilha) { int errnum; if( (pPilha->pTopo = (struct TipoElementoPilha*)malloc(sizeof(struct TipoElementoPilha))) == NULL ) { errnum = errno; PERRLN("Erro 'InicPilha'"); LogMessage("Erro 'InicPilha': %s\n", strerror(errnum)); return FALSE; } memset(pPilha->pTopo->Elemento, '\0', sizeof(pPilha->pTopo->Elemento)); pPilha->pTopo->pProx = NULL; pPilha->tamanho = 0; return TRUE; }/* InicPilha */ /*! * \brief Armazena um elemento no topo da pilha. * \param item - item que sera armazenado no topo da pilha. * \param pPilha - ponteiro para a pilha. * \return TRUE em caso elemento pode ser colocado no topo da pilha, * FALSE caso contrário. * * \remark A política desta pilha e LIFO (last in first out). * * \sa lePilha, InicPilha, Pop, VaziaPilha, TamanhoPilha, ImprimePilha ****************************************************************************************/ bool Push(TipoItem *item, struct TipoPilha *pPilha) { int errnum; struct TipoElementoPilha *paux; if( (paux = (struct TipoElementoPilha*)malloc(sizeof(struct TipoElementoPilha))) == NULL ) { errnum = errno; PERRLN("Erro 'Push'"); LogMessage("Erro 'Push': %s\n", strerror(errnum)); return FALSE; } paux->pProx = pPilha->pTopo; strcpy(pPilha->pTopo->Elemento, item); pPilha->tamanho++; pPilha->pTopo = paux; return TRUE; }/* Push */ /*! * \brief Remove elemento do topo da pilha. * \param pPilha - ponteiro para pilha. * \return Ponteiro para elemento que foi removido. * * \sa lePilha, Push, Pop, VaziaPilha, TamanhoPilha, ImprimePilha ****************************************************************************************/ TipoItem *Pop(struct TipoPilha *pPilha) { struct TipoElementoPilha *paux; if( VaziaPilha(pPilha) ) { fprintf(stderr, "Erro pilha vazia.\n"); LogMessage("Erro pilha vazia.\n"); return NULL; } paux = pPilha->pTopo; pPilha->pTopo = paux->pProx; free(paux); pPilha->tamanho--; return pPilha->pTopo->Elemento; }/* Pop */ /*! * \brief Verifica se a pilha possui elemento(s). * \param pPilha - ponteiro para a pilha. * \return TRUE em caso a pilha esta vazia, * FALSE caso contrário. * \remark A política desta pilha e LIFO (last in first out). * * \sa lePilha, InicPilha, Push, TamanhoPilha, ImprimePilha ****************************************************************************************/ bool VaziaPilha(struct TipoPilha *pPilha) { return( pPilha->tamanho == 0 ); } /*! * \brief Obtem número de elementos da pilha. * \param pPilha - ponteiro para a pilha. * \return número de elementos da pilha. * * \sa lePilha, InicPilha, Push, Pop, VaziaPilha, ImprimePilha ****************************************************************************************/ UINT TamanhoPilha(struct TipoPilha *pPilha) { return( pPilha->tamanho ); } /*! * \brief Imprime na saída padrão a lista de elementos da pilha. * \param pPilha - ponteiro para a pilha. * \sa lePilha, InicPilha, Push, Pop, VaziaPilha, TamanhoPilha ****************************************************************************************/ void ImprimePilha(struct TipoPilha *pPilha) { int i; char buff[TAM_ELEMENTO+1] = {'\0'}; struct TipoElementoPilha *paux; if( VaziaPilha(pPilha) ) { fprintf(stderr, "Erro pilha vazia.\n"); LogMessage("Erro pilha vazia.a\n"); return; } system("clear"); fprintf(stderr, "%-7s %s\n", "número:", "BRINDE:"); memset(buff, '=', sizeof(buff)-1); fprintf(stderr, "%-7.7s %32.32s\n", buff, buff); i = 1; paux = pPilha->pTopo->pProx; do { fprintf(stderr, "%7.5d %-s\n", i++, paux->Elemento); paux = paux->pProx; }while( paux != NULL ); }/* ImprimePilha */