48 lines
685 B
Go
48 lines
685 B
Go
|
package main
|
||
|
|
||
|
type Stack[Item any] interface {
|
||
|
Push(Item)
|
||
|
Pop() Item
|
||
|
Peek() Item
|
||
|
At(int) Item
|
||
|
Size() int
|
||
|
Empty() bool
|
||
|
}
|
||
|
|
||
|
type node[Item any] struct {
|
||
|
item Item
|
||
|
next *node[Item]
|
||
|
}
|
||
|
|
||
|
type stack[OfType any] []OfType
|
||
|
|
||
|
func NewStack[OfType any]() Stack[OfType] {
|
||
|
return &stack[OfType]{}
|
||
|
}
|
||
|
|
||
|
func (s *stack[Item]) Push(item Item) {
|
||
|
*s = append(*s, item)
|
||
|
}
|
||
|
|
||
|
func (s *stack[Item]) Pop() Item {
|
||
|
last := s.Peek()
|
||
|
*s = (*s)[:len(*s)-1]
|
||
|
return last
|
||
|
}
|
||
|
|
||
|
func (s *stack[Item]) At(idx int) Item {
|
||
|
return (*s)[idx]
|
||
|
}
|
||
|
|
||
|
func (s *stack[Item]) Peek() Item {
|
||
|
return (*s)[len(*s)-1]
|
||
|
}
|
||
|
|
||
|
func (s *stack[_]) Size() int {
|
||
|
return len(*s)
|
||
|
}
|
||
|
|
||
|
func (s *stack[_]) Empty() bool {
|
||
|
return s.Size() == 0
|
||
|
}
|