Способ C сделать это состоит в том, чтобы обернуть все состояния для вашего «объекта» в структуру, а затем явно передать ее во все функции, которые работают со стеками, поэтому должно быть:
typedef struct _stack {
int arr[MAX];
int counter;
} stack;
int isstackempty(stack *s)
{
return s->counter <= 0;
}
int push(stack *s, int n)
{
if (s->counter >= MAX) {
printf("Stack is full. Couldn't push %d", n);
return -1;
}
arr[s->counter++] = n;
return 0
}
int pop(stack *s, int *n)
{
if(isstackempty(s) || n == 0) {
printf("Stack is empty\n");
return -1;
}
*n = arr[--s->counter];
return 0;
}
Проблема с вашим примером заключается в том, что вы пишете определения функций, как будто у нас есть объектная структура на основе классов, которой нет в Си. Самый простой способ подумать о том, как это делается в C, состоит в том, что вы пишете методы, которые требуют явной передачи параметра this.
Также вы можете иметь эквивалент конструкторов и деструкторов, которые могут дополнительно абстрагировать ваш «объект».
stack* newStack() {
stack* s = malloc(sizeof(stack));
s->counter = 0;
return s;
}
void freeStack(stack* s) {
free(s);
}