Stacks and Queues
Stack Push/Pop
Push values onto a stack and pop them back in last-in, first-out order.
Algorithm
The replay uses the same three values in every language, so this Go DSA implementation can be compared directly with the rest of the DSA track.
top
The top is the most recently pushed value.
LIFO
A stack removes values in last-in, first-out order.
Visual walkthrough
Basic Implementation
basic.go
package main
import (
"fmt"
"strings"
)
func render(values []int) string {
parts := make([]string, 0, len(values))
for _, value := range values {
parts = append(parts, fmt.Sprint(value))
}
return strings.Join(parts, " -> ")
}
func main() {
stack := []int{}
for _, value := range []int{10, 20, 30} { stack = append(stack, value) }
popped := []int{}
for len(stack) > 0 { popped = append(popped, stack[len(stack)-1]); stack = stack[:len(stack)-1] }
fmt.Println(render(popped))
}
Complexity
- Time: O(1) per push/pop
- Space: O(n)
Implementation notes
- Go represents the stack as
stack := []int{}. Pushing10,20, and30usesappend(stack, value), which may grow the backing array while preserving the replay-visible order[10, 20, 30]. - Pop reads the top with
stack[len(stack)-1], appends that value topopped, then shrinks the slice header withstack = stack[:len(stack)-1]. - The loop guard
len(stack) > 0prevents an empty-slice index. Reslicing can keep the backing array alive while the slice is retained, but this replay drains the stack immediately. - The trace records
stack=[], thenstack=[10, 20, 30], then the first pop topopped=[30]andstack=[10, 20], followed bypopped=[30, 20, 10]andstack=[]. renderconverts each poppedintwithfmt.Sprint, joins the strings withstrings.Join(parts, " -> "), andfmt.Printlnprints30 -> 20 -> 10.