关于栈: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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理