A dynamic stack using a resizable array is a stack data structure that grows or shrinks its underlying array size automatically when elements are pushed or popped, allowing flexible memory use without fixed size limits.
Click to reveal answer
beginner
How does the stack resize when it becomes full?
When the stack's underlying array is full, it creates a new array with double the current capacity and copies all elements to this new array, allowing more elements to be pushed.
Click to reveal answer
intermediate
Why do we shrink the array size in a dynamic stack?
Shrinking the array size when the number of elements is much smaller than the capacity saves memory by releasing unused space, typically when the stack size falls below a quarter of the capacity.
Click to reveal answer
intermediate
What is the time complexity of push and pop operations in a dynamic stack using a resizable array?
Push and pop operations are O(1) on average (amortized) because resizing happens rarely. However, resizing itself takes O(n) time where n is the number of elements during the resize.
Click to reveal answer
beginner
Show the steps to push an element when the stack is full in a dynamic stack using a resizable array.
1. Detect the array is full. 2. Create a new array with double capacity. 3. Copy all elements to the new array. 4. Replace the old array with the new one. 5. Add the new element to the stack top.
Click to reveal answer
What happens when you push an element onto a full dynamic stack using a resizable array?
AThe push operation fails with an error
BThe array size doubles and elements are copied to the new array
CThe array size halves to save memory
DThe element is discarded
✗ Incorrect
When the stack is full, it doubles the array size and copies existing elements to the new array before adding the new element.
When does a dynamic stack shrink its underlying array?
AWhen the stack size is less than one quarter of the array capacity
BWhen the stack size reaches the array capacity
CWhen the stack is empty
DWhen the stack size is more than half the array capacity
✗ Incorrect
Shrinking happens when the stack size falls below 25% of the array capacity to save memory.
What is the average time complexity of push operation in a dynamic stack using a resizable array?
AO(log n)
BO(n)
CO(1)
DO(n^2)
✗ Incorrect
Push is O(1) on average because resizing happens rarely and is amortized over many operations.
Which of the following is NOT a benefit of using a dynamic stack with a resizable array?
AFlexible size without fixed limits
BAutomatic memory optimization
CEfficient average push and pop operations
DConstant time resizing for every push
✗ Incorrect
Resizing is not constant time; it takes O(n) time but happens rarely, so average push/pop remain efficient.
What is the main reason to copy elements to a new array during resizing?
ATo increase or decrease the capacity of the stack
BTo sort the elements
CTo remove duplicates
DTo reverse the stack order
✗ Incorrect
Copying elements to a new array happens to change the capacity (usually double or half) to accommodate more or fewer elements.
Explain how a dynamic stack using a resizable array manages memory when pushing and popping elements.
Think about what happens when the stack is full or almost empty.
You got /4 concepts.
Describe the steps and reasoning behind resizing the array in a dynamic stack.
Focus on how resizing keeps the stack flexible and efficient.
You got /5 concepts.
Practice
(1/5)
1. What is the main advantage of using a dynamic stack implemented with a resizable array compared to a fixed-size array stack?
easy
A. It can grow or shrink automatically as elements are pushed or popped.
A fixed-size array stack cannot grow beyond its initial capacity, causing overflow if too many elements are pushed.
Step 2: Understand dynamic stack behavior
A dynamic stack with a resizable array automatically increases or decreases its size when needed, avoiding overflow and wasting less memory.
Final Answer:
It can grow or shrink automatically as elements are pushed or popped. -> Option A
Quick Check:
Dynamic resizing = Automatic growth/shrink [OK]
Hint: Dynamic arrays resize automatically on overflow or underflow [OK]
Common Mistakes:
Thinking dynamic stack has fixed size
Confusing linked list stack with array stack
Assuming no resizing is needed
2. Which of the following Go code snippets correctly doubles the size of the stack's underlying array when it is full?
easy
A. stack.data = append(stack.data, make([]int, len(stack.data))...)
B. newData := make([]int, len(stack.data)*2); copy(newData, stack.data); stack.data = newData
C. stack.data = stack.data[:len(stack.data)*2]
D. stack.data = make([]int, len(stack.data)/2)
Solution
Step 1: Understand how to resize an array in Go
Go slices cannot be resized directly; we create a new slice with double capacity and copy old elements.
Step 2: Check each option
newData := make([]int, len(stack.data)*2); copy(newData, stack.data); stack.data = newData creates a new slice double the size, copies old data, and assigns it back, which is correct resizing.
Initial data slice size is 2, size=0. Push 10 at index 0, size=1; Push 20 at index 1, size=2.
Step 2: Push 30 triggers resize
Since size == len(data), create newData with size 4, copy old data, assign newData. Then add 30 at index 2, size=3.
Step 3: Print slice up to size
Print data[:3] which contains [10 20 30].
Final Answer:
[10 20 30] -> Option C
Quick Check:
Resize + push = [10 20 30] [OK]
Hint: Resize before push when full, then add element [OK]
Common Mistakes:
Forgetting to resize before push
Printing full data slice including zeros
Index out of range by pushing without resize
4. The following Go code for popping from a dynamic stack sometimes causes a runtime error. What is the bug?
func (s *Stack) Pop() int {
s.size--
val := s.data[s.size]
if s.size < len(s.data)/4 {
newData := make([]int, len(s.data)/2)
copy(newData, s.data[:s.size])
s.data = newData
}
return val
}
medium
A. Decreasing size before checking if stack is empty causes negative index.
B. Resizing array to half size before copying causes data loss.
C. Copying data after resizing causes runtime error.
D. Returning val before resizing causes stale value.
Solution
Step 1: Analyze size decrement before access
Decreasing size before accessing data[s.size] can cause s.size to be negative if stack is empty.
Step 2: Understand runtime error cause
Accessing data with negative index causes runtime panic (index out of range).
Final Answer:
Decreasing size before checking if stack is empty causes negative index. -> Option A
Quick Check:
Pop decrements size before check = negative index [OK]
Hint: Check empty before decrementing size [OK]
Common Mistakes:
Not checking if stack is empty before pop
Resizing array incorrectly
Accessing data after size decrement without validation
5. You want to implement a dynamic stack in Go that shrinks its underlying array when the number of elements falls below one-fourth of the capacity, but never shrinks below a minimum capacity of 4. Which code snippet correctly implements this logic inside the Pop method?
hard
A. if s.size < len(s.data)/2 && len(s.data)/4 >= 4 { newData := make([]int, len(s.data)/4); copy(newData, s.data[:s.size]); s.data = newData }
B. if s.size < len(s.data)/4 { s.data = s.data[:len(s.data)/2] }
C. if s.size < 4 { s.data = make([]int, 4) }
D. if s.size < len(s.data)/4 && len(s.data)/2 >= 4 { newData := make([]int, len(s.data)/2); copy(newData, s.data[:s.size]); s.data = newData }
Solution
Step 1: Understand shrinking condition
Shrink when size < 1/4 capacity, but only if new capacity ≥ 4.
Step 2: Check each option
if s.size < len(s.data)/4 && len(s.data)/2 >= 4 { newData := make([]int, len(s.data)/2); copy(newData, s.data[:s.size]); s.data = newData } checks size < 1/4 capacity and new capacity ≥ 4, then resizes to half capacity correctly.