Pop Operation on Stack in DSA Go - Time & Space Complexity
We want to understand how long it takes to remove an item from a stack using the pop operation.
How does the time needed change as the stack grows bigger?
Analyze the time complexity of the following code snippet.
// Pop removes the top element from the stack
func (s *Stack) Pop() (int, bool) {
if len(s.items) == 0 {
return 0, false // stack empty
}
topIndex := len(s.items) - 1
topItem := s.items[topIndex]
s.items = s.items[:topIndex]
return topItem, true
}
This code removes the last element added to the stack and returns it.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Accessing and slicing the last element of the stack's internal slice.
- How many times: This happens once per pop call, no loops or recursion involved.
Removing the top item always takes the same steps regardless of stack size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 5 steps |
| 100 | 5 steps |
| 1000 | 5 steps |
Pattern observation: The number of steps stays constant no matter how big the stack is.
Time Complexity: O(1)
This means popping an item takes the same short time no matter how many items are in the stack.
[X] Wrong: "Pop takes longer when the stack is bigger because there are more items to check."
[OK] Correct: Pop only removes the top item directly without checking all others, so time does not grow with stack size.
Knowing that pop is a quick, constant-time operation helps you explain why stacks are efficient for last-in-first-out tasks.
"What if the stack was implemented using a linked list instead of a slice? How would the time complexity of pop change?"
Practice
pop operation do in a stack?Solution
Step 1: Understand stack behavior
A stack follows Last In First Out (LIFO) principle, so the last added element is removed first.Step 2: Define pop operation
The pop operation removes and returns the top element of the stack, which is the last inserted item.Final Answer:
Removes and returns the top element of the stack -> Option DQuick Check:
Pop = remove top element [OK]
- Thinking pop removes from bottom
- Confusing pop with peek
- Assuming pop clears the stack
stack?Solution
Step 1: Identify top element index in slice
In Go, the top of the stack is the last element: index len(stack)-1.Step 2: Correctly slice to remove top element
To pop, get element at len(stack)-1, then slice stack up to len(stack)-1 to remove it.Final Answer:
element := stack[len(stack)-1]; stack = stack[:len(stack)-1] -> Option BQuick Check:
Pop syntax = element last, slice off last [OK]
- Using index len(stack) which is out of range
- Removing from front instead of end
- Not updating the stack slice after pop
stack := []int{10, 20, 30}
element := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(element)
fmt.Println(stack)Solution
Step 1: Identify popped element
element = stack[len(stack)-1] = stack[2] = 30Step 2: Update stack after pop
stack = stack[:2] = [10, 20]Final Answer:
30 [10 20] -> Option AQuick Check:
Pop returns 30, stack left [10 20] [OK]
- Printing old stack without slicing
- Confusing index for popped element
- Not updating stack slice after pop
stack := []int{5, 15, 25}
element := stack[len(stack)]
stack = stack[:len(stack)-1]
fmt.Println(element)What is the error in this code?
Solution
Step 1: Check index used for popping
Accessing stack[len(stack)] is invalid because slice indices go from 0 to len(stack)-1.Step 2: Identify runtime error
This causes an index out of range runtime error when trying to access stack[len(stack)].Final Answer:
Index out of range error due to accessing stack[len(stack)] -> Option AQuick Check:
Index must be len(stack)-1, not len(stack) [OK]
- Using len(stack) as index
- Ignoring runtime errors
- Assuming slice indexing is inclusive of len
stack := []int{1, 2, 3, 4, 5}. You want to pop two elements and then push 10 and 20. What will be the final stack?Solution
Step 1: Pop two elements from stack
Pop removes last two elements: 5 and 4. Stack becomes [1, 2, 3].Step 2: Push 10 and 20 onto stack
Appending 10 and 20 results in [1, 2, 3, 10, 20].Final Answer:
[1 2 3 10 20] -> Option CQuick Check:
Pop twice, then push twice = [1 2 3 10 20] [OK]
- Not popping twice before pushing
- Appending instead of replacing popped elements
- Confusing order of push and pop
Ready to prove it?
Pass the test and this pattern moves unknown
