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

你可能感兴趣的:(栈数据结构golang)