废话不多说,直接看代码
package main
import (
"fmt"
)
type Stack struct {
Container []int
Top int
Size int
}
func NewStack(size int) *Stack {
return &Stack{
Container: make([]int, size),
Top: 0,
Size: size,
}
}
func (s *Stack) Push(e int) bool {
if s.IsFull() {
return false
}
s.Container[s.Top] = e
s.Top++
return true
}
func (s *Stack) Pop() (flag bool, ret int) {
if s.IsEmpty() {
return false, 0
}
ret = s.Container[s.Top-1] // 栈顶的位置是待压栈的位置,最后一个元素是它前面的一个
s.Container[s.Top-1] = 0
s.Top--
return true, ret
}
func (s *Stack) IsFull() bool {
if s.Top == s.Size {
return true
}
return false
}
func (s *Stack) IsEmpty() bool {
if s.Top == 0 {
return true
}
return false
}
func main() {
stack := NewStack(3)
fmt.Println(stack.Pop())
stack.Push(1)
stack.Push(2)
stack.Push(3)
fmt.Println(stack.Pop())
fmt.Println(stack.Pop())
fmt.Println(stack.Pop())
}
四项注意点
- 压栈(push)前一定要判断栈满了没有,否则会出现越界访问的问题。
- 出栈(pop)前一定要判断栈空了没有,否则会出现越界访问的问题。
- 注意Top的含义是:待压栈的位置,最后一个元素在它前面的一个位置。
- 真正使用 压栈和出栈一定判断是否成功
有疑问加站长微信联系(非本文作者)