// Una pila de enteros: el último valor que entra es el primero que sale.
// Es un tipo opaco, y este encabezado no dice cómo se guardan los valores.
#ifndef STACK_H
#define STACK_H

typedef struct stack Stack;

// Crea una pila vacía. Devuelve NULL si no hay memoria.
// Owner: quien llama, que debe liberarla con stack_free.
Stack *stack_new(void);

// Libera la pila y todo lo que tenga adentro. Acepta NULL.
void stack_free(Stack *stack);

// Pone value arriba. Devuelve 1 si pudo y 0 si no hay memoria; en ese caso, nada cambia.
int stack_push(Stack *stack, int value);

// Saca el valor de arriba y lo guarda en *value. Devuelve 1 si pudo.
// Si la pila está vacía, devuelve 0 y no toca *value.
int stack_pop(Stack *stack, int *value);

// Como stack_pop, pero el valor se queda en la pila.
int stack_peek(const Stack *stack, int *value);

// Devuelve cuántos valores hay en la pila.
int stack_size(const Stack *stack);

#endif
