Te paso una pila básica codificada en C. Espero que te sirva.
			Código (c) [Seleccionar] 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <locale.h>
typedef struct tpila {
    int dato;
    struct tpila *siguiente;
} pila;
pila* pila_new() {
    return NULL;
}
bool pila_push(pila **top, int dato) {
    bool retValue = false;
    pila *nodo = malloc(sizeof(pila));
    if(!nodo)
        goto final_pila_push;
    nodo->dato = dato;
    nodo->siguiente = *top;
    *top = nodo;
    retValue = true;
final_pila_push:
    return retValue;
}
bool pila_pop(pila **top, int *dato) {
    bool retValue = false;
    pila *nodo = *top;
    if(!nodo)
        goto final_pila_pop;
    *dato = nodo->dato;
    *top = nodo->siguiente;
    free(nodo);
    retValue = true;
final_pila_pop:
    return retValue;
}
bool pila_top(pila ** const top, int *dato) {
    bool retValue = false;
    if(!*top)
        goto final_pila_top;
    *dato = (*top)->dato;
    retValue = true;
final_pila_top:
    return retValue;
}
void pila_free(pila **top) {
    pila *nodo;
    while(*top) {
        nodo = *top;
        *top = nodo->siguiente;
        free(nodo);
    }
}
int main() {
    int n;
    pila *p = pila_new();
    setlocale(LC_ALL, "spanish");
    pila_push(&p, 5);
    pila_push(&p, 2);
    pila_push(&p, 3);
    pila_top(&p, &n);
    printf("En la pila está el valor %d\n", n);
    pila_pop(&p, &n);
    printf("Se saca de la pila el valor %d\n", n);
    pila_pop(&p, &n);
    printf("Se saca de la pila el valor %d\n", n);
    pila_free(&p);
}