栈、队列、双端队列和优先队列

285 阅读2分钟

栈 (Stack)

栈的话,可以想象成一个先入后出的容器结构,先进来的元素就叠在一起了,不能从最下面出任何元素。

队列 (Queue)

队列的话,更好理解,类似去银行窗口排队,先进先出。

Stack & Queue 总结

  • Stack: 先入后出,添加、删除皆为O(1),因为是无序的,所以查询操作为O(n)
  • Queue: 先入先出,添加、删除皆为O(1),因为是无序的,所以查询操作为O(n)

双端队列 (Deque)

Double-Ended Queue的缩写

实战中,我们可能会更多用到栈或队列的衍生结构,双端队列就是队列的衍生结构其中的一种,我们可以在它的头部添加或删除元素,也可以在尾部添加或删除元素。

Deque 总结

  • 简单理解:两端都可以进出的队列
  • 插入和删除都是O(1操作),因为是无序的,查询操作为O(n)

优先队列 (Priority Queue)

  • 插入操作O(1)
  • 取出操作O(logN) - 按照元素的优先级取出,看起来是比普通队列取出操作O(1)变慢了,但是这样设计的一个好处是,比如排队,vip可以先行,类似于这种现象。其实如果用普通队列来实现优先取出的话,时间复杂度为O(n),更慢了
  • 底层具体实现的数据结构较为多样和复杂(只要知道有很多种方法可以实现即可):
    1. heap(堆)实现: 但是heap也有多种实现,不一定是二叉树实现的堆,它可能是Fibonacci(斐波那契)堆,也可能是其他形式的堆。
    2. bst(二叉搜索树)实现: 也可以是平衡的二叉搜索树来实现,比如说红黑树或者AVL来实现。
    3. treap等一些高级数据结构来实现