队列与堆栈的数据结构

数据结构(堆与队列的线性结构与链式结构)

  • 特点
    • 先进后出(FILO)
    • 线性栈,限定仅在表尾(栈顶)进行插入和删除的线性表,栈满需要进行扩容操作
    • 链栈,栈顶一般放在单链表的头部,一般不需要设置头结点,添加到栈底的第一个元素指针域为null,之后每一个指针域都指向上一个添加的元素

队列

  • 特点

    • 先进先出(FIFO,队尾入队头出),只能在一端(tail,elements.length-1 处)进行插入元素,而在另一端(head,索引为0处)进行删除元素操作。(头尾相接的队列称为循环队列)
    • 队列满的条件是(tail+1)%QueueSize==head
    • 通用计算队列长度的公式(tail-head+QueueSize)%QueueSize
  • 队列添加删除的细节

    • head 与 tail 是用来标记队列的指针。空队列时,两指针同时位于线性表索引为0处
    • 队列特点是(假设线性表索引是从左至右),添加元素,元素从队列右侧进入,tail++,tail向右移1位;删除元素,元素从左侧取出,head++,head 向右移1位,索引为0处值为null。

线性 与 链式结构 比较

  • 不同
    • 线性数据结构,初始化指定Capacity(容量) ,查找根据索引查找,时间复杂度为O(1);增删需要调整各元素的位置,时间复杂度为O(n)
    • 链式数据结构,增删元素时间复杂度为O(1);指定索引处增删时间复杂度为O(n),因为需要进行遍利,同理查找元素的复杂度为O(n),链式数据结构没有容量限制,但是内存是有限的

堆 与 队列 相互转换

  • 原理:堆与队列是线性表与链表的不同逻辑结构实现,物理存储结构都是基于线性表或链表

  • 结构转换

    • 堆栈的栈顶(即元素进出的位置),可以当作队列的头部;堆栈的栈底,可以当作队列的尾部
  • 转换源码细节(强烈推荐去查阅API)

    • 线性结构,参考Java的ArrayDeque 的增删操作
    • 链式结构,参考Java的LinkedList 的增删操作
原文地址:https://www.cnblogs.com/luckyCoder/p/12733020.html