乐趣区

关于栈:Go数据结构破冰之路二栈的爱恨情仇

定义

// 线性表的一种,构造上一端凋谢、一端关闭
// 凋谢的一端,容许进行插入和删除操作,称为栈顶
// 关闭的一端,成为栈底

// 依据定义写出栈的结构构造体 (假设栈中都是整型元素)
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 1
true 2
true 3
true 4
true 5
false 6
true 5
true 4
true 3
true 2
true 1
false 0
退出移动版