数据结构(十)——队列(queue)小结

逻辑结构:线性结构
存储结构:数组描述或链表描述
对数据的运算:empty()、size()、pop()、push(x)、front()、back()

概念:生活中的排队,讲究“先来后到”。在特定条件下体现了公平性,于是队列常被用于各种调度问题中。

应用实例:

  • 各种调度问题
  • 列车车厢重排

队列实现有两个特别需要注意的点:

  1. 数组实现时由公式化实现的环状空间(逻辑上的环状,物理上仍是一维数组)
  2. 数组实现时判断栈队列满和队列空

逻辑上的环状空间:
优势 :重复利用出队列的元素的空间
具体表现:

  • 队列弹出元素时,头指针:Q.front = (Q.front+1)%maxSize;
  • 队列推入元素时,尾指针:Q.back = (Q.back+1)%maxSize;
  • 获取队列长度:(Q.back+maxSize-Q,front)%maxSize;

判断队列满或队列空
参考书上给出了三种方法,最优秀也最广泛的是第一种方法,精致到不愿意新建哪怕一个变量来存储队列长度。

方法:牺牲一个队列单元来区分队空和队满。
队空条件:Q.front = Q.back;
队满条件:Q.front = (Q.back+1)%maxSize;

其余两种方法分别是增加size变量、增加tag变量。
size变量通过【Q.front = Q.back】+ size的值来判断(满:size = maxSize;空:size = 0;)
tag变量通过【Q.front = Q.back】+ tag的值来判断(满:tag = true; 空:tag=false; 进队列,tag刷新为true,出队列,tag刷新为false)

猜你喜欢

转载自blog.csdn.net/qq_41882686/article/details/107008811
今日推荐