Stacks and Queues
Stack Push/Pop
Push values onto a stack and pop them back in last-in, first-out order.
Algorithm
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.
top
The top is the most recently pushed value.
LIFO
A stack removes values in last-in, first-out order.