mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 00:22:41 +08:00
58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
package generics
|
|
|
|
import "errors"
|
|
|
|
type ArrayStack[T any] struct {
|
|
data []T
|
|
length int
|
|
}
|
|
|
|
func NewArrayStack[T any]() *ArrayStack[T] {
|
|
return &ArrayStack[T]{data: []T{}, length: 0}
|
|
}
|
|
|
|
func (s *ArrayStack[T]) Data() []T {
|
|
return s.data
|
|
}
|
|
|
|
func (s *ArrayStack[T]) Size() int {
|
|
return s.length
|
|
}
|
|
|
|
func (s *ArrayStack[T]) IsEmpty() bool {
|
|
return s.length == 0
|
|
}
|
|
|
|
// Push element into stack
|
|
func (s *ArrayStack[T]) Push(value T) {
|
|
s.data = append([]T{value}, s.data...)
|
|
s.length++
|
|
}
|
|
|
|
// Pop delete the top element of stack then return it, if stack is empty, return nil and error
|
|
func (s *ArrayStack[T]) Pop() (*T, error) {
|
|
if s.IsEmpty() {
|
|
return nil, errors.New("stack is empty")
|
|
}
|
|
|
|
topItem := s.data[0]
|
|
s.data = s.data[1:]
|
|
s.length--
|
|
|
|
return &topItem, nil
|
|
}
|
|
|
|
// Peak return the top element of stack then return it
|
|
func (s *ArrayStack[T]) Peak() (*T, error) {
|
|
if s.IsEmpty() {
|
|
return nil, errors.New("stack is empty")
|
|
}
|
|
return &s.data[0], nil
|
|
}
|
|
|
|
// Clear the stack data
|
|
func (s *ArrayStack[T]) Clear() {
|
|
s.data = []T{}
|
|
s.length = 0
|
|
}
|