// programa de stack/pilha de // objetos encadeados em struct (Routo Terada 2010) // Funcionando com EmpilhaTopo e DesempilhaTopo #include #include // a seguir typedef global typedef struct nodo{ // typedef aqui com nome int INFO; struct nodo *Prox; // aponta para proximo } NO; // aqui vai nome do tipo que e' NO int PilhaVazia(NO *cabec){ // pilha vazia ? if(cabec->Prox == cabec){ // Cabeca da pilha printf("Pilha estaa vazia\n"); return -1; } else {printf("Pilha nao estaa vazia\n"); return 1;} } NO * EmpilhaTopo(NO *cabec, int O){ // objeto O NO *pNovo; // a seguir, reserva memo da Lista Livre pNovo = (NO *) malloc(sizeof(NO)); if(pNovo != NULL){ pNovo -> INFO = O; pNovo -> Prox = cabec->Prox; cabec -> Prox = pNovo; printf("Dentro de EmpilhaTopo, INFO = %d\n", pNovo -> INFO); return cabec; } else {return NULL;} // Lista Livre esgotada } int DesempilhaTopo(NO *cabec){ // Desempilha objeto O NO *pTopo; int O; if(cabec -> Prox != cabec){ pTopo = cabec->Prox; O = pTopo -> INFO; cabec -> Prox = pTopo -> Prox; printf("Dentro de DesempilhaTopo, INFO = %d\n", O); free(pTopo); // devolve memo para a Lista Livre return O; } else {printf("Tentou desempilhar pilha vazia\n"); return -999;} } void ImprPilha(NO *cabec){ // exibe todos os objetos NO *pNo; int O; pNo = cabec -> Prox; // aponta para o objeto no topo if(pNo == cabec) printf("Pilha estaa vazia\n"); else printf("Objetos na Pilha, do topo ate a base:\n"); while(pNo != cabec){ // enqto não atinge a base da pilha O = pNo -> INFO; printf(" INFO = %d\n", O); pNo = pNo -> Prox; // um no abaixo, na pilha } } int main(){ NO *pNovo, *cabec; int Obj; // definir cabeca da pilha cabec = (NO *) malloc(sizeof(NO)); // da Lista Livre cabec -> INFO = -9999; cabec -> Prox = cabec; printf("INFO = %d\n", cabec -> INFO); if(PilhaVazia(cabec) == -1) printf("Verificou que a pilha estaa vazia\n"); cabec = EmpilhaTopo(cabec, 656); ImprPilha(cabec); cabec = EmpilhaTopo(cabec, 444); ImprPilha(cabec); cabec = EmpilhaTopo(cabec, 323 ); ImprPilha(cabec); Obj = DesempilhaTopo(cabec); printf("Desempilhou %d\n", Obj); ImprPilha(cabec); system("pause"); return 0; }