栈
定义
// 线性表的一种,构造上一端凋谢、一端关闭// 凋谢的一端,容许进行插入和删除操作,称为栈顶// 关闭的一端,成为栈底// 依据定义写出栈的结构构造体(假设栈中都是整型元素)type Stack struct { // 一个寄存栈元素的容器 container []int // 栈顶标记 top int // 容量限度 size int}// 依据构造体写出栈的构造方法func NewStack(size int) *Stack { // 返回的是Stack构造体指针 return &Stack{ // 用切片来示意栈容器 container: make([]int, size), // 初始栈顶元素为0 top: 0, // 容量限度同入参size size: size, }}
基本操作
栈判空:栈顶标记为零栈判满:栈顶标记等于容量限度入栈:把某一元素放入栈顶出栈:把栈顶元素取出
// 栈判空func (s *Stack) IsEmpty() bool { if s.top == 0 { return true } return false}// 栈判满func (s *Stack) IsFull bool { if s.top == s.size { return true } return false}// 入栈func (s *Stack) Push(e int) bool { if s.IsFull() { fmt.Println(false, e) return false } s.container[s.top] = e s.top++ fmt.Println(true, e) return true}// 出栈func (s *Stack) Pop() (flag bool, ret int) { if s.IsEmpty() { return false, ret } ret = s.container[s.top] s.top-- return true, ret}
测试
func main() { s := NewStack(5) s.Push(1) s.Push(2) s.Push(3) s.Push(4) s.Push(5) s.Push(6) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop()) fmt.Println(s.Pop())}// 运行后果true 1true 2true 3true 4true 5false 6true 5true 4true 3true 2true 1false 0