105 lines
1.9 KiB
Go
105 lines
1.9 KiB
Go
package stack
|
|
|
|
type Stack struct {
|
|
size int
|
|
height int
|
|
data []int
|
|
next *Stack // Pointer to the next element in the stack stack
|
|
}
|
|
|
|
func NewStack(size int, next *Stack) *Stack {
|
|
return &Stack{
|
|
size: size,
|
|
height: 0,
|
|
data: make([]int, size),
|
|
next: next,
|
|
}
|
|
}
|
|
|
|
func (s *Stack) Clear() {
|
|
s.height = 0
|
|
}
|
|
|
|
func (s *Stack) Duplicate() {
|
|
if s.height > 0 {
|
|
s.Push(s.data[s.height-1])
|
|
} else {
|
|
s.Push(0)
|
|
s.Push(0)
|
|
}
|
|
}
|
|
|
|
func (s *Stack) Pop() int {
|
|
if s.height > 0 {
|
|
s.height--
|
|
return s.data[s.height]
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func (s *Stack) Push(value int) {
|
|
if s.height >= s.size {
|
|
s.size += 32
|
|
s.data = append(s.data, make([]int, 32)...)
|
|
}
|
|
s.data[s.height] = value
|
|
s.height++
|
|
}
|
|
|
|
func (s *Stack) Swap() {
|
|
a := s.Pop()
|
|
b := s.Pop()
|
|
s.Push(a)
|
|
s.Push(b)
|
|
}
|
|
|
|
func (s Stack) GetHeights() []int {
|
|
if s.next != nil {
|
|
return append(s.next.GetHeights(), s.height)
|
|
} else {
|
|
return []int{s.height}
|
|
}
|
|
}
|
|
|
|
func (toss *Stack) Transfert(soss *Stack, n int) {
|
|
// Implements a value transfert between two stacks, intended for use with the '{'
|
|
// (aka begin) and '}' (aka end) stackstack commands
|
|
toss.height += n
|
|
if toss.height > toss.size {
|
|
toss.data = append(toss.data, make([]int, toss.height-toss.size)...)
|
|
toss.size = toss.height
|
|
}
|
|
for i := 1; i <= min(soss.height, n); i++ {
|
|
toss.data[toss.height-i] = soss.data[soss.height-i]
|
|
for i := min(soss.height, n) + 1; i <= n; i++ {
|
|
toss.data[toss.height-i] = 0
|
|
}
|
|
}
|
|
soss.height -= n
|
|
if soss.height < 0 {
|
|
soss.height = 0
|
|
}
|
|
}
|
|
|
|
func (s Stack) Next() *Stack {
|
|
return s.next
|
|
}
|
|
|
|
func (s *Stack) Discard(n int) {
|
|
// Implements a discard mechanism intended for use with the '}'(aka end) stackstack command
|
|
s.height -= n
|
|
if s.height < 0 {
|
|
s.height = 0
|
|
}
|
|
}
|
|
|
|
func (s *Stack) YCommandPick(n int, h int) {
|
|
if n > s.height {
|
|
s.height = 1
|
|
s.data[0] = 0
|
|
} else {
|
|
v := s.data[s.height-n]
|
|
s.height = h
|
|
s.Push(v)
|
|
}
|
|
}
|