#include <stdio.h>
#include <stdlib.h>
// Node structure for stack
typedef struct Node {
int val;
struct Node* next;
} Node;
// Stack structure
typedef struct Stack {
Node* top;
} Stack;
// Initialize stack
void initStack(Stack* s) {
s->top = NULL;
}
// Push value onto stack
void push(Stack* s, int val) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = val;
newNode->next = s->top;
s->top = newNode;
}
// Pop value from stack
int pop(Stack* s) {
if (s->top == NULL) return -1; // empty stack
Node* temp = s->top;
int val = temp->val;
s->top = temp->next;
free(temp);
return val;
}
// Peek top value
int top(Stack* s) {
if (s->top == NULL) return -1;
return s->top->val;
}
// MinStack structure with two stacks
typedef struct MinStack {
Stack mainStack;
Stack minStack;
} MinStack;
// Initialize MinStack
void minStackInit(MinStack* ms) {
initStack(&ms->mainStack);
initStack(&ms->minStack);
}
// Push value onto MinStack
void minStackPush(MinStack* ms, int val) {
push(&ms->mainStack, val); // push to main stack
int currentMin = top(&ms->minStack);
if (currentMin == -1 || val <= currentMin) {
push(&ms->minStack, val); // push to min stack if smaller or equal
} else {
push(&ms->minStack, currentMin); // else push current min again
}
}
// Pop from MinStack
void minStackPop(MinStack* ms) {
pop(&ms->mainStack); // pop main stack
pop(&ms->minStack); // pop min stack to keep in sync
}
// Get minimum value
int minStackGetMin(MinStack* ms) {
return top(&ms->minStack);
}
// Print stack from top to bottom
void printStack(Stack* s) {
Node* curr = s->top;
while (curr != NULL) {
printf("%d -> ", curr->val);
curr = curr->next;
}
printf("null\n");
}
int main() {
MinStack ms;
minStackInit(&ms);
minStackPush(&ms, 5);
minStackPush(&ms, 3);
minStackPush(&ms, 7);
printf("Main Stack: ");
printStack(&ms.mainStack);
printf("Min Stack: ");
printStack(&ms.minStack);
printf("Current Min: %d\n", minStackGetMin(&ms));
minStackPop(&ms);
printf("After pop:\n");
printf("Main Stack: ");
printStack(&ms.mainStack);
printf("Min Stack: ");
printStack(&ms.minStack);
printf("Current Min: %d\n", minStackGetMin(&ms));
return 0;
}
push(&ms->mainStack, val);
push value onto main stack to keep all elements
int currentMin = top(&ms->minStack);
get current minimum from min stack top
if (currentMin == -1 || val <= currentMin) { push(&ms->minStack, val); } else { push(&ms->minStack, currentMin); }
push new min or repeat current min to keep min stack synced
pop(&ms->mainStack); pop(&ms->minStack);
pop from both stacks to keep them aligned
return top(&ms->minStack);
return current minimum from min stack top
Main Stack: 7 -> 3 -> 5 -> null
Min Stack: 3 -> 3 -> 5 -> null
Current Min: 3
After pop:
Main Stack: 3 -> 5 -> null
Min Stack: 3 -> 5 -> null
Current Min: 3