Why Stack Exists and What Problems It Solves in DSA Go - Performance Analysis
Stacks help us manage data in a last-in, first-out way. Understanding their time complexity shows why they are fast and useful for certain problems.
We want to know how the time to add or remove items grows as the stack gets bigger.
Analyze the time complexity of the following stack operations.
// Simple stack push and pop operations
func (s *Stack) Push(value int) {
s.items = append(s.items, value)
}
func (s *Stack) Pop() int {
if len(s.items) == 0 {
return -1 // empty stack
}
val := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return val
}
This code adds (push) and removes (pop) items from the stack using a slice.
Look at what repeats when we use the stack.
- Primary operation: Adding or removing one item at the end of the slice.
- How many times: Each push or pop happens once per operation, no loops inside.
Each push or pop takes about the same time no matter how many items are in the stack.
| Input Size (n) | Approx. Operations per push/pop |
|---|---|
| 10 | 1 |
| 100 | 1 |
| 1000 | 1 |
Pattern observation: Time stays constant as the stack grows.
Time Complexity: O(1)
This means each push or pop takes the same short time, no matter how big the stack is.
[X] Wrong: "Pushing or popping from a stack takes longer as it gets bigger because it has more items."
[OK] Correct: The stack only adds or removes from the end, so it does not need to move or check all items. The time stays the same.
Knowing stack operations are fast helps you choose the right tool for problems like undo actions, expression evaluation, or backtracking. This skill shows you understand efficient data handling.
"What if we used a linked list instead of a slice for the stack? How would the time complexity of push and pop change?"
Practice
Solution
Step 1: Understand the role of stack in function calls
Stacks help keep track of which function called which, so the program can return to the right place after finishing a function.Step 2: Recognize the order of operations in stacks
Stacks follow Last In First Out (LIFO), which matches how function calls return in reverse order.Final Answer:
To keep track of function calls and return in the correct order -> Option CQuick Check:
Stack = function call tracking [OK]
- Thinking stack stores data randomly
- Confusing stack with sorting
- Assuming stack stores data permanently
Solution
Step 1: Recall how slices work in Go
In Go, slices can be appended using the built-in append function.Step 2: Identify the correct syntax for adding to stack
Since stack is a slice, adding an element is done by stack = append(stack, element).Final Answer:
stack = append(stack, element) -> Option AQuick Check:
Go slice append = push stack [OK]
- Using non-existent push method on slice
- Using add or insert which are not Go slice methods
- Forgetting to assign back to stack after append
stack := []int{}
stack = append(stack, 10)
stack = append(stack, 20)
stack = append(stack, 30)
last := stack[len(stack)-1]
stack = stack[:len(stack)-1]
fmt.Println(last)Solution
Step 1: Trace the stack after each append
After appending 10, 20, 30, stack = [10, 20, 30].Step 2: Identify the last element and remove it
last = stack[len(stack)-1] = 30; then stack is sliced to remove last element.Final Answer:
30 -> Option BQuick Check:
Last pushed = 30 popped = 30 [OK]
- Printing first element instead of last
- Confusing slice indexing
- Expecting error due to slicing
stack := []int{1, 2, 3}
last := stack[len(stack)]
stack = stack[:len(stack)-1]
fmt.Println(last)Solution
Step 1: Check indexing used to get last element
stack[len(stack)] tries to access index equal to length, which is out of range (indexes go from 0 to len-1).Step 2: Confirm correct index for last element
The last element is at stack[len(stack)-1], so the code causes runtime error.Final Answer:
Index out of range error when accessing stack[len(stack)] -> Option AQuick Check:
Indexing error = Index out of range error when accessing stack[len(stack)] [OK]
- Using len(stack) as index instead of len(stack)-1
- Assuming slice indexing starts at 1
- Ignoring runtime errors
Solution
Step 1: Understand stack's LIFO property for reversing
Pushing characters in order and popping reverses their order.Step 2: Identify correct method to reverse string using stack
Push all chars, then pop to build reversed string matches stack usage.Final Answer:
Push each character onto a stack, then pop all to build reversed string -> Option DQuick Check:
Stack LIFO reverses string [OK]
- Using queue which reverses differently
- Appending without stack does not use stack concept
- Sorting changes order, not reverses
Ready to prove it?
Pass the test and this pattern moves unknown
