leetcode

Leetcode Solutions (0x6A73)
git clone https://git.pngu.org/leetcode
Log | Files | Refs | Submodules | README

design_stack_increment_op.c (1629B)


// 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);
}