#include <stdio.h>
#include <stdlib.h>

// define a estrutura do no
struct no {
  int numero;
  struct no *prox;
};

// define um ponteiro para o no raiz
struct no *Raiz=NULL;

// define a pilha
int pilha[100];
int topo=0;

// rotina para insercao de um numero na lista encadeada
void insereLista(int numero) {
  struct no *Atual;
  struct no *Proximo;
  struct no *Inserido;

  // verifica se o nó raiz é nulo. Se for, cria nó raiz com os dados fornecidos
  if (Raiz==NULL) {
    Raiz = (struct no *)malloc(sizeof(struct no));
    Raiz->numero = numero;
    Raiz->prox = NULL;
  }
  else {  // se já houver raiz

    // percorre a lista encadeada, comecando da raiz
    Atual = Raiz;
    while (Atual->prox!=NULL) {
      Proximo = Atual->prox;
      Atual = Proximo;
    }

    // aloca memória para o novo nó
    Inserido = (struct no *)malloc(sizeof(struct no));
    
    // coloca o nó na lista encadeada, mudando o ponteiro para o próximo no
    // do último nó
    Atual->prox = Inserido;
    
    // coloca dados no nó Inserido
    Inserido->numero = numero;

    // indica que o nó inserido é agora o último nó
    Inserido->prox = NULL;
  }
}

// rotina para insercao de um numero na pilha
void push (int numero) {
  if (topo==100)
    printf ("Pilha cheia!\n");
  else {
    pilha[topo]=numero;
    topo++;
  }
}

int pop() {
  if (topo==0) {
    printf ("Pilha vazia!\n");
    return 0;
  }
  else {
    topo--;
    return pilha[topo];
  }
}

	
main () {
  int i;
  int numero;
  struct no *Atual;
  
  printf ("Digite ate 100 numeros inteiros. Se quiser parar, digite 0.\n");
  for (i=1;i<=100;i++) {
    scanf("%d",&numero);
    if (numero != 0)
      insereLista(numero);
    else
      break;
  }

  // percorre a lista encadeada, colocando os numeros na pilha
  Atual = Raiz;
  while (Atual != NULL) {
    push(Atual->numero);
    Atual = Atual->prox;
  }

  // retira os numeros da pilha e coloca-os na tela
  numero = pop();
  while (numero!=0) {
    printf ("Retirado: %d\n",numero);
    numero = pop();
  }
}
 
