What if your stack could magically grow whenever you need more space, without you lifting a finger?
Why Dynamic Stack Using Resizable Array in DSA C?
Imagine you have a stack of plates on your kitchen counter. You want to add more plates, but the stack can only hold a fixed number. When you run out of space, you have to find another stack or start a new pile, which is messy and slow.
Using a fixed-size array for a stack means you must guess the maximum size in advance. If you guess too small, you run out of space and must stop or create a new stack manually. If you guess too big, you waste memory. Also, resizing manually is complicated and error-prone.
A dynamic stack using a resizable array automatically grows the array size when needed. It copies the old data to a bigger array behind the scenes, so you never run out of space and don't waste memory. This makes adding and removing items smooth and easy.
int stack[5]; int top = -1; // Can't push if top == 4 // No resizing
int *stack = malloc(2 * sizeof(int)); int top = -1, capacity = 2; // Resize when top == capacity - 1 // Push works smoothly
You can build stacks that grow and shrink as needed, handling any number of items without stopping or wasting space.
Think of a web browser's back button history. The number of pages you visit changes all the time, so the stack storing history must grow dynamically to remember all pages you visited.
Fixed-size stacks limit how many items you can store.
Dynamic stacks resize automatically to fit more items.
This makes stacks flexible and efficient for real-world use.
Practice
Solution
Step 1: Understand fixed vs dynamic size
A fixed-size array stack has a set capacity that cannot change during runtime.Step 2: Identify dynamic array behavior
A dynamic stack with a resizable array can increase or decrease its size as elements are pushed or popped.Final Answer:
It can grow or shrink in size as needed during runtime. -> Option CQuick Check:
Dynamic resizing means flexible size [OK]
- Thinking dynamic stack has fixed size
- Confusing memory usage with resizing
- Assuming no resizing is needed
Solution
Step 1: Identify correct use of realloc
realloc is used to resize the memory block; new size should be double current capacity times element size.Step 2: Check each option
stack->array = realloc(stack->array, stack->capacity * 2 * sizeof(int)); correctly doubles capacity and multiplies by sizeof(int). Others either allocate wrong size or use malloc instead of realloc.Final Answer:
stack->array = realloc(stack->array, stack->capacity * 2 * sizeof(int)); -> Option AQuick Check:
Double capacity with realloc [OK]
- Using malloc instead of realloc for resizing
- Dividing capacity instead of doubling
- Not multiplying by sizeof element
void push(Stack *stack, int value) {
if (stack->top == stack->capacity - 1) {
stack->capacity *= 2;
stack->array = realloc(stack->array, stack->capacity * sizeof(int));
}
stack->array[++stack->top] = value;
}
Stack stack = {malloc(2 * sizeof(int)), 2, -1};
push(&stack, 10);
push(&stack, 20);
push(&stack, 30);
What is the value of stack.capacity after these operations?Solution
Step 1: Initial capacity and pushes
Initial capacity is 2. After pushing 2 elements, stack is full (top = 1).Step 2: Push triggers resize
On pushing third element, capacity doubles from 2 to 4.Final Answer:
4 -> Option AQuick Check:
Capacity doubles when full [OK]
- Assuming capacity increases by 1
- Forgetting to double capacity
- Confusing top index with capacity
int pop(Stack *stack) {
if (stack->top == -1) {
printf("Stack Underflow\n");
return -1;
}
int value = stack->array[stack->top--];
if (stack->top < stack->capacity / 4) {
stack->capacity /= 2;
stack->array = realloc(stack->array, stack->capacity * sizeof(int));
}
return value;
}Solution
Step 1: Analyze capacity reduction condition
Capacity halves when top is less than one-fourth capacity.Step 2: Identify edge case
If capacity becomes 0 or less, realloc with zero size causes segmentation fault.Final Answer:
Reducing capacity below 1 causes invalid realloc size. -> Option DQuick Check:
Capacity must not shrink below 1 [OK]
- Ignoring minimum capacity limit
- Confusing overflow with underflow
- Misusing post-decrement operator
int pop(Stack *stack) {
if (stack->top == -1) {
printf("Stack Underflow\n");
return -1;
}
int value = stack->array[stack->top--];
if (stack->top < stack->capacity / 4) {
stack->capacity /= 2;
stack->array = realloc(stack->array, stack->capacity * sizeof(int));
}
return value;
}Solution
Step 1: Understand shrinking condition
Stack shrinks when elements < 1/4 capacity but must not go below 2 capacity.Step 2: Add capacity lower bound check
Before halving capacity, check if capacity is greater than 2 to avoid shrinking below 2.Final Answer:
Add a check: if (stack->capacity > 2) before halving capacity. -> Option BQuick Check:
Prevent capacity below 2 by conditional check [OK]
- Shrinking capacity below minimum allowed
- Changing condition incorrectly
- Removing resizing causes memory waste
Ready to prove it?
Pass the test and this pattern moves unknown
