diff options
Diffstat (limited to 'design_stack_increment_op.c')
-rw-r--r-- | design_stack_increment_op.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/design_stack_increment_op.c b/design_stack_increment_op.c new file mode 100644 index 0000000..fbab1f4 --- /dev/null +++ b/design_stack_increment_op.c @@ -0,0 +1,64 @@ +// 1381. Design a Stack With Increment Operation +#include "leetcode.h" + +/* + * design a stack that supports increment operations on its elements. implement + * the function increment that increments the bottom 'k' elements of the stack + * by 'val' if there are less than 'k' elements in the stack, increment all the + * elements in the stack + */ + +typedef struct { + int *data; + int idx; + int size; +} CustomStack; + +CustomStack *customStackCreate(int maxSize) { + CustomStack *obj = malloc(sizeof(CustomStack)); + obj->data = (int *)calloc(maxSize, sizeof(int)); + obj->size = maxSize; + obj->idx = 0; + return obj; +} + +void customStackPush(CustomStack *obj, int x) { + if (obj->idx == obj->size) + return; + obj->data[obj->idx] = x; + obj->idx++; +} + +int customStackPop(CustomStack *obj) { + if (!(obj->idx)) + return -1; + obj->idx--; + return obj->data[obj->idx]; +} + +void customStackIncrement(CustomStack *obj, int k, int val) { + int min = k < obj->idx ? k : obj->idx; + for (int i = 0; i < min; i++) + obj->data[i] += val; +} + +void customStackFree(CustomStack *obj) { + free(obj->data); + free(obj); +} + +int main() { + CustomStack *obj = customStackCreate(3); + customStackPush(obj, 1); + customStackPush(obj, 2); + printf("%d\n", customStackPop(obj)); // expect: 2 + customStackPush(obj, 2); + customStackPush(obj, 3); + customStackPush(obj, 4); + customStackIncrement(obj, 5, 100); + printf("%d\n", customStackPop(obj)); // expect: 103 + printf("%d\n", customStackPop(obj)); // expect: 202 + printf("%d\n", customStackPop(obj)); // expect: 201 + printf("%d\n", customStackPop(obj)); // expect: -1 + customStackFree(obj); +} |