6、队列的实现

队列的定义及实现

队列的定义
  队列是一种特殊的线性表
  队列仅在线性表的两端进行操做
   队头(Front):取出数据元素的一端
   队尾(Rear):插入数据元素的一端
队列的性质
  先进先出(FIFO,First In First Out)
6、队列的实现
 队列的一些经常使用操做
  建立队列
  销毁队列
  清空队列
  进队列
  出队列
  获取队头元素
  获取队列的长度
队列的顺序存储实现
6、队列的实现
实现代码:附件中SeqQue文件夹
队列的链式存储实现
6、队列的实现
实现代码:附件中ListQue文件夹node

队列的优化实现

 顺序队列
  线性表的第一个元素做为队头
  线性表的最后一个元素做为队尾
 入队的新元素是在线性表的最后,时间复杂度为O(1)
 出队时须要将后续的全部元素向前移动,时间复杂度O(n)
问题:如何将出队操做的时间复杂度下降到O(1)?
顺序队列的优化方案
 定义front使其始终表明队头的下标
  出队时将队头元素返回,且front++
 定义rear使其始终表明队尾下一个元素的下标
  入队时将新元素插入,且rear++
 没有必要只将下标为0的位置定义为队头
6、队列的实现
顺序队列的关键状态
 初始状态:length == 0, front == 0, rear == 0;
 空队列状态:length == 0, front == rear;
 满队列状态:length == capacity, front == rear;
循环使用队列中的空间
 入队:rear = (rear + 1) % capacity;
 出队:front = (front + 1) % capacity;
实现代码:附件中SeqQue_2文件夹
链式队列的瓶颈
 链式队列
  线性表的第一个元素做为队头
  线性表的最后一个元素做为队尾
 入队的新元素是在线性表的最后,时间复杂度为O(n)
 出队的元素即链表的第一个元素,时间复杂度O(1)
问题:如何将入队操做的时间复杂度下降到O(1)?
链式队列的优化方案
 定义rear指针始终指向链表中的最有一个元素
  入队时将新元素经过rear插入队尾,且将rear指向新元素
6、队列的实现
链式队列的关键状态
 空队列状态:front == NULL, rear == NULL;
关键操做
 入队:
  rear->next = node;
  rear = node;
  node->next = NULL;
 出队:
  front = front->next;
实现代码:附件中ListQue_2文件夹算法

队列的特别实现

栈与队列:用栈实现队列
6、队列的实现
实现思路
 准备两个栈用于实现队列:inStack和outStack
 当有新元素入队时:将其压入inStack中
 当须要出队时:
  当outStack为空时:
   1. 将inStack中的元素逐一弹出并压入outStack中
   2. 将outStack的栈顶元素弹出
  当outStack不为空时:
   – 直接将outStack的栈顶元素弹出
算法框架
6、队列的实现
实现代码:附件中NewQue文件夹框架

附件ide

相关文章
相关标签/搜索