
A stack is a Last-In-First-Out (LIFO) data structure.
Below is a generic Go implementation supporting Push, Pop, Peek, and IsEmpty operations.
package main
import (
"fmt"
)
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func (s *Stack[T]) Pop() (T, error) {
var zero T
if len(s.items) == 0 {
return zero, fmt.Errorf("stack is empty")
}
last := len(s.items) - 1
item := s.items[last]
s.items = s.items[:last]
return item, nil
}
func (s *Stack[T]) Peek() (T, error) {
var zero T
if len(s.items) == 0 {
return zero, fmt.Errorf("stack is empty")
}
return s.items[len(s.items)-1], nil
}
func (s *Stack[T]) IsEmpty() bool {
return len(s.items) == 0
}
func main() {
st := Stack[int]{}
st.Push(1)
st.Push(2)
top, _ := st.Pop()
fmt.Println("Popped:", top) // 2
peek, _ := st.Peek()
fmt.Println("Peek:", peek) // 1
fmt.Println("Is empty?", st.IsEmpty()) // false
}