73 lines
1.3 KiB
Go
73 lines
1.3 KiB
Go
|
package collection
|
|||
|
|
|||
|
import (
|
|||
|
. "gitea.zaclys.com/bvaudour/gob/option"
|
|||
|
)
|
|||
|
|
|||
|
// Stack représente une pile d’élément.
|
|||
|
// Une pile est une collection où les éléments suivant la logique “dernier arrivé, premier servi“.
|
|||
|
type Stack[T any] struct {
|
|||
|
first *chain[T]
|
|||
|
size uint
|
|||
|
}
|
|||
|
|
|||
|
// Len retourne le nombre d’éléments de la pile.
|
|||
|
func (s Stack[T]) Len() uint {
|
|||
|
return s.size
|
|||
|
}
|
|||
|
|
|||
|
// Push ajoute tous les éléments d’entrée dans la pile.
|
|||
|
func (s *Stack[T]) Push(elems ...T) {
|
|||
|
for _, e := range elems {
|
|||
|
s.first = prevChain(e, s.first)
|
|||
|
s.size++
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Pop dépile le premier élément de la pile et le retourne.
|
|||
|
func (s *Stack[T]) Pop() (e Option[T]) {
|
|||
|
if s.size > 0 {
|
|||
|
e = Some(s.first.value)
|
|||
|
s.first = s.first.next
|
|||
|
s.size--
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// ToSlice convertit une pile en slice.
|
|||
|
func (s *Stack[T]) ToSlice() (sl []T) {
|
|||
|
sl = make([]T, s.size)
|
|||
|
c := s.first
|
|||
|
for i := uint(0); i < s.size; i++ {
|
|||
|
sl[i] = c.value
|
|||
|
c = c.next
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// ToQueue convertit une pile en file.
|
|||
|
func (s *Stack[T]) ToQueue() (q *Queue[T]) {
|
|||
|
q = &Queue[T]{
|
|||
|
first: s.first,
|
|||
|
size: s.size,
|
|||
|
}
|
|||
|
|
|||
|
var c = s.first
|
|||
|
for i := uint(1); i < s.size; i++ {
|
|||
|
c = c.next
|
|||
|
}
|
|||
|
q.last = c
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// NewStack retourne une pile initialisée à partir des données d’entrées.
|
|||
|
func NewStack[T any](elems ...T) (s *Stack[T]) {
|
|||
|
s = new(Stack[T])
|
|||
|
s.Push(elems...)
|
|||
|
|
|||
|
return
|
|||
|
}
|