====== stack ====== LIFO (last in first out) stack structure ===== Structs ===== ''%%Stack%%'' is a linked list with stack-based operations available #define Stack List ===== Functions ===== ==== stack_init ==== Intializes the stack. The user is responsible for creating the initial ''%%Stack%%'' structure and freeing memory with ''%%stack_destroy()%%''. ''%%destroy%%'' is a deallocation function for the members of ''%%Stack%%'', pass ''%%NULL%%'' if the memory is stack-allocated void stack_init(Stack *stack, void (*destroy)(void *data)); /* Usage */ Stack *stack = malloc(sizeof(Stack)); // Pass NULL for stack-allocated memory stack_init(stack, NULL); // Pass free or a custom freeing function for heap allocated memory stack_init(stack, free); ==== stack_destroy ==== Destroys the nodes inside a ''%%Stack%%'' and calls the deallocation funciton on the data if one was provided. Does not destroy the list itself, that is left up to the user. void stack_destroy(Stack *stack); ==== stack_push ==== Push a new element onto the top of the stack int stack_push(Stack *stack, void *data); ==== stack_peek ==== Returns a ''%%void *%%'' to the top element of the stack. Does not remove the element void *stack_peek(Stack *stack); /* Usage */ // stack: 1 2 3 int *t = (int*)stack_peek(stack); assert(*t == 3); // stack: 1 2 3 ==== stack_pop ==== Returns a ''%%void *%%'' to the top element of the stack and removes the element int stack_pop(Stack *stack, void **data); /* Usage */ // stack: 1 2 3 int *t = (int*)stack_peek(stack); assert(*t == 3); // stack: 1 2