通过两个数组实现队列

使出栈和入栈的时间复杂度都为O(1)

protocol Queue {
    associatedtype Element
    mutating func enqueue(_ newElement: Element)
    mutating func dequeue() -> Element?
}
struct FIFOQueue<Element>: Queue {
    private var left: [Element] = []
    private var right: [Element] = []
    
    /// 将元素添加到队列最后
    /// - 复杂度:O(1)
    /// - Parameter newElement: Element
    mutating func enqueue(_ newElement: Element) {
        right.append(newElement)
    }
    
    /// 从当前队列前端移除一个元素
    /// 当队列为空时,返回nil
    /// - 复杂度:平摊 O(1)
    mutating func dequeue() -> Element? {
        if left.isEmpty {
            left = right.reversed()
            right.removeAll()
        }
        return left.popLast()
    }
}

就和数组的扩容一样,扩容的操作并不是时刻发生,它的频率是低频的,平摊下来接近于O(1)这里的将 right 数组 reversed 到 left 数组,虽然是 O(n) 的操作,但是队列入栈和出栈的频次是完全高于 reversed 的,所以平摊复杂度是 O(1)

来自 https://leejnull.github.io/2019/12/30/2019-12-30-01/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 规矩既然制定了,就应该去执行。那么在执行这个制度的时候,我们更加要以身作则,遵守规矩,对于做错的人,应该宽容,把她...
    溧阳万达DDM杨飘阅读 188评论 0 0
  • 这是六月的阳光,像是父亲严厉的目光 一个人在路上走着,在这高楼大厦间 我看到一群青春少女走过斑马线 碎花裙子铺满了...
    钟春生的诗阅读 192评论 0 3
  • 源码分析专题 (源码经典设计模式,如何写代码,提升技术审美,提高核心竞争力!) 1.常用设计模式 2.sping5...
    JAVA架构师的圈子阅读 2,305评论 0 0