44 lines
660 B
Go
44 lines
660 B
Go
package internal
|
|
|
|
type Node[T any] struct {
|
|
Value T
|
|
}
|
|
|
|
type Stack[T any] struct {
|
|
Nodes []*Node[T]
|
|
count int
|
|
}
|
|
|
|
func NewStack[T any]() *Stack[T] {
|
|
return &Stack[T]{
|
|
Nodes: make([]*Node[T], 10),
|
|
}
|
|
}
|
|
|
|
func (s *Stack[T]) Push(val T) {
|
|
if s.count >= len(s.Nodes) {
|
|
Nodes := make([]*Node[T], len(s.Nodes)*2)
|
|
copy(Nodes, s.Nodes)
|
|
s.Nodes = Nodes
|
|
}
|
|
s.Nodes[s.count] = &Node[T]{Value: val}
|
|
s.count++
|
|
}
|
|
|
|
func (s *Stack[T]) Pop() *Node[T] {
|
|
if s.count == 0 {
|
|
return nil
|
|
}
|
|
node := s.Nodes[s.count-1]
|
|
s.count--
|
|
return node
|
|
}
|
|
|
|
func (s *Stack[T]) IsEmpty() bool {
|
|
return s.count == 0
|
|
}
|
|
|
|
func (s *Stack[T]) IsNotEmpty() bool {
|
|
return s.count != 0
|
|
}
|