如何在一个数组A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。
实现:
- 两个栈分别从数组的两端开始,向中间push元素,直到两个指针相遇。
package main
import "fmt"
const maxSize = 10
const (
sLeft stackType = iota
sRight
)
type stackType int
type Stack struct {
arr [maxSize]int
left int
right int
}
var stack = Stack{
arr: [maxSize]int{},
left: -1,
right: maxSize,
}
func (s *Stack) Push(val int, stackType stackType) bool {
if s.IsFull() {
return false
}
if stackType == sLeft {
s.arr[s.left+1] = val
s.left++
} else {
s.arr[s.right-1] = val
s.right--
}
return true
}
func (s *Stack) Pop(stackType stackType) (val int, exist bool) {
if stackType == sLeft {
if s.left > -1 {
val = s.arr[s.left]
exist = true
s.left--
}
} else {
if s.right < maxSize {
val = s.arr[s.right]
exist = true
s.right++
}
}
return
}
func (s *Stack) IsEmpty() bool {
if s.right == maxSize && s.left == -1 {
return true
}
return false
}
func (s *Stack) IsFull() bool {
if s.right-s.left == 1 {
return true
}
return false
}