Очереди и стеки в стандартной библиотеке

container/list — двусвязный список, используется как основа для дека:

import "container/list"

// Стек
stack := list.New()
stack.PushBack(1)
stack.PushBack(2)
stack.PushBack(3)
top := stack.Back()
stack.Remove(top)
fmt.Println(top.Value) // 3

// Очередь
queue := list.New()
queue.PushBack("a")
queue.PushBack("b")
front := queue.Front()
queue.Remove(front)
fmt.Println(front.Value) // "a"

Реализуй интерфейс heap.Interface для любого типа:

import "container/heap"

type MinHeap []int

func (h MinHeap) Len() int           { return len(h) }
func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
func (h *MinHeap) Push(x any)        { *h = append(*h, x.(int)) }
func (h *MinHeap) Pop() any {
    old := *h
    n := len(old)
    v := old[n-1]
    *h = old[:n-1]
    return v
}

h := &MinHeap{5, 1, 3}
heap.Init(h)
heap.Push(h, 2)
fmt.Println(heap.Pop(h)) // 1
fmt.Println(heap.Pop(h)) // 2

Канал Go — это потокобезопасная очередь с фиксированным буфером:

// Буферизированный канал = очередь ёмкостью 10
ch := make(chan int, 10)

go func() {
    for i := 0; i < 5; i++ { ch <- i }
    close(ch)
}()

for v := range ch { fmt.Println(v) }

Для задач producer-consumer в Go каналы — идиоматичный инструмент.


ЗаданиеСложность
1Упражнение 1easy
2Упражнение 2easy
3Упражнение 3medium