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 Go?
Imagine you have a stack of plates at home. You want to add more plates, but your shelf has a fixed size. When you run out of space, you have to find a new shelf or rearrange everything manually.
Manually resizing the shelf is slow and tiring. You might drop plates or lose track of their order. Also, guessing the right shelf size beforehand is hard, leading to wasted space or frequent moves.
A dynamic stack using a resizable array automatically grows the shelf when needed. It copies plates to a bigger shelf behind the scenes, so you never run out of space and keep your plates in order without extra effort.
var stack [5]int var top int // fixed size, cannot push more than 5 items func push(item int) { if top == 5 { fmt.Println("Stack full") return } stack[top] = item top++ }
var stack []int
func push(item int) {
stack = append(stack, item) // grows automatically
}You can keep adding items without worrying about size limits or manual resizing, making your program flexible and efficient.
Think of a web browser's back button history. It keeps growing as you visit pages, and a dynamic stack helps store this history without fixed limits.
Manual fixed-size stacks limit how much you can store.
Dynamic stacks resize automatically to fit more items.
This makes your code simpler and more flexible.
Practice
Solution
Step 1: Understand fixed-size array stack limitation
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 AQuick Check:
Dynamic resizing = Automatic growth/shrink [OK]
- Thinking dynamic stack has fixed size
- Confusing linked list stack with array stack
- Assuming no resizing is needed
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.Final Answer:
newData := make([]int, len(stack.data)*2); copy(newData, stack.data); stack.data = newData -> Option BQuick Check:
Resize by new slice + copy = newData := make([]int, len(stack.data)*2); copy(newData, stack.data); stack.data = newData [OK]
- Using append to resize underlying array incorrectly
- Slicing beyond capacity without copying
- Reducing size instead of increasing
func (s *Stack) Push(val int) {
if s.size == len(s.data) {
newData := make([]int, len(s.data)*2)
copy(newData, s.data)
s.data = newData
}
s.data[s.size] = val
s.size++
}
stack := Stack{data: make([]int, 2), size: 0}
stack.Push(10)
stack.Push(20)
stack.Push(30)
fmt.Println(stack.data[:stack.size])
What is the output?Solution
Step 1: Trace initial stack state and pushes
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 CQuick Check:
Resize + push = [10 20 30] [OK]
- Forgetting to resize before push
- Printing full data slice including zeros
- Index out of range by pushing without resize
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
}
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 AQuick Check:
Pop decrements size before check = negative index [OK]
- Not checking if stack is empty before pop
- Resizing array incorrectly
- Accessing data after size decrement without validation
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.Final Answer:
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 } -> Option DQuick Check:
Shrink only if size < 1/4 and new capacity ≥ 4 [OK]
- Shrinking below minimum capacity
- Incorrect condition for shrinking
- Using wrong new capacity size
Ready to prove it?
Pass the test and this pattern moves unknown
