数据结构之栈

栈的性质

  • 只允许一段插入和删除数据
  • 先进后出
  • 栈可以用链表实现也可以用数组实现

操作时间复杂度

入栈和出栈时间复杂度都为O(1) (因为只涉及操作栈顶部的第一个元素) 
涉及到可扩容的栈的时候,因为栈满了要扩容,数据迁移时间复杂度为O(n) 但是前n次插入的时间复杂度都是O(1) 进行均摊后, 时间复杂度为O(2) = O(1) 所以不管是否扩容 时间复杂度都是O(1)

曾经(去年) 面试的时候有个面试官曾过我, 你知道栈吗? 两个栈怎么组成一个先进先出的队列, 可是我太年轻那,bb半天也没有让人家满意。

栈的golang代码实现

type ArrayStack struct {
    data []interface{}
    top int
}

func NewArrayStack() *ArrayStack {
    return &ArrayStack{
        data: make([]interface{}, 0, 32),
        top: -1,
    }
}

func (this *ArrayStack) IsEmpty() bool {
    return this.top < 0
}

func (this *ArrayStack) Push(v interface{}) {
    this.top += 1
    if this.top > len(this.data) -1 {
        // 大于当前容量, 进行扩容
        this.data = append(this.data, v)
    }else {
        this.data[this.top] = v
    }
}

func (this *ArrayStack) Pop() interface{} {
    if this.IsEmpty() {
        return nil
    }
    v := this.data[this.top]
    this.top -= 1
    return v
}

func (this *ArrayStack) Top() interface{} {
    if this.IsEmpty() {
        return nil
    }
    return this.data[this.top]
}

func (this *ArrayStack) Print() {
    if this.IsEmpty() {
        fmt.Println("empty")
    }else {
        for i := this.top; i >= 0; i-- {
            fmt.Println(this.data[i])
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容