Реализуйте стек (LIFO) для элементов любого типа.
type Stack[T any] struct {
// ...
}
// Push кладёт v на вершину.
func (s *Stack[T]) Push(v T)
// Pop снимает элемент с вершины. Пустой стек — нулевое значение T и false.
func (s *Stack[T]) Pop() (T, bool)
// Peek возвращает вершину, не снимая её. Пустой стек — нулевое значение T и false.
func (s *Stack[T]) Peek() (T, bool)
// Len — число элементов.
func (s *Stack[T]) Len() int
Требования
- Нулевое значение готово к работе:
var s Stack[int]; s.Push(1) — без конструктора.
Push — амортизированно O(1), Pop, Peek, Len — O(1).
- Снятый элемент не должен удерживаться стеком: если
T — указатель, после Pop
объект может быть собран GC, даже если стек ещё жив.
Пример
var s Stack[string]
s.Push("a")
s.Push("b")
s.Peek() // "b", true
s.Pop() // "b", true
s.Pop() // "a", true
s.Pop() // "", false
Устно: чем ваш стек отличается от container/list, и почему для стека в Go обычно
хватает слайса?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.