#include <stdio.h>
#include <stdlib.h>
#define MAX 5
typedef struct {
int data[MAX];
int top;
} Stack;
void init(Stack* s) {
s->top = -1; // stack empty
}
int isFull(Stack* s) {
return s->top == MAX - 1;
}
int isEmpty(Stack* s) {
return s->top == -1;
}
void push(Stack* s, int val) {
if (isFull(s)) {
printf("Stack overflow\n");
return;
}
s->top++;
s->data[s->top] = val; // add on top
}
int pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack underflow\n");
return -1;
}
int val = s->data[s->top];
s->top--; // remove top
return val;
}
void printStack(Stack* s) {
for (int i = s->top; i >= 0; i--) {
printf("%d -> ", s->data[i]);
}
printf("null\n");
}
int main() {
Stack s;
init(&s);
// Using stack abstraction
push(&s, 1);
push(&s, 2);
push(&s, 3);
push(&s, 4); // push 4
printStack(&s); // expect 4 -> 3 -> 2 -> 1 -> null
pop(&s); // pop once
printStack(&s); // expect 3 -> 2 -> 1 -> null
// Direct array use without stack abstraction
int arr[MAX] = {1, 2, 3};
int size = 3;
// Add 4 without size check
arr[size] = 4; // no size update
// Remove last element by zeroing without size update
arr[size] = 0;
printf("Array after direct use: [");
for (int i = 0; i < MAX; i++) {
printf("%d", arr[i]);
if (i < MAX - 1) printf(", ");
}
printf("]\n");
return 0;
}advance top pointer to next free slot before adding new item
s->data[s->top] = val; // add on top
place new value at top position to maintain stack order
int val = s->data[s->top];
retrieve value from top before removing it
move top pointer down to remove top item
4 -> 3 -> 2 -> 1 -> null
3 -> 2 -> 1 -> null
Array after direct use: [1, 2, 3, 0, 0]