// // Created by nano on 4/30/25. // #include #include #include "stack.h" #include #include void stack_init(stack *stack) { stack -> length = 0; stack -> size = 1; stack -> data = calloc(stack->size,sizeof(cell)); } void stack_free(stack *stack) { free(stack -> data); stack->size = 0; stack->length = 0; } void stack_reinit(stack *stack) { stack_free(stack); stack_init(stack); } void stack_expand(stack *stack) { stack -> size = stack -> size *2; cell *new_data = calloc(stack -> size ,sizeof(cell)); memcpy(new_data, stack -> data, stack -> size/2 * sizeof(cell)); free(stack -> data); stack -> data = new_data; } void stack_push(stack *stack, cell c) { if (stack -> length + 1 == stack -> size) { stack_expand(stack); } stack -> data[stack -> length++] = c; } void stack_shrink(stack *stack) { stack -> size = stack -> size / 2; cell *new_data = calloc(stack -> size , sizeof(cell)); memcpy(new_data, stack -> data, stack -> size * sizeof(cell)); free(stack -> data); stack -> data = new_data; } cell stack_pop(stack *stack) { if (stack -> length > 0) { const cell c = stack -> data[stack -> length - 1]; if ((stack->length - 1) == (stack->size / 2) && stack -> size/2 !=0) { stack_shrink(stack); } stack -> length--; return c; } return (cell) {INT_MAX,INT_MAX}; } void stack_invert(stack *stack) { cell *inv_data = calloc(stack -> size , sizeof(cell)); for (int i=0;ilength;i++) inv_data[stack->length -1 - i] = stack->data[i]; free(stack -> data); stack -> data = inv_data; } void stack_append(const stack *from, stack *to) { const int size = (int) pow(2, ceil(log2(to->length + from->length))); // power of 2 which has enough space to hold all the contents of both stacks. cell *new_data = calloc(size,sizeof(cell)); memcpy(new_data, to->data, to->length * sizeof(cell)); memcpy(new_data+to->length, from -> data, from -> length * sizeof(cell)); free(to->data); to->data = new_data; to->length = to->length + from -> length; to->size = size; }