10.队列的应用场景,银行排队;队尾rear添加数据,队首front取数据;可以通过数组或链表实现

数组模拟队列,环形队列_韩顺平听课笔记_添加数据

11.数组模拟队列的思路,Queue类存放数组

数组模拟队列,环形队列_韩顺平听课笔记_环形队列_02

数组模拟队列,环形队列_韩顺平听课笔记_循环队列_03

问题:数组只能用一次,当数组数据加满后,不能再添加;且数据取出完后,不能再添加数据,front和rear都指向了队尾——>环形队列

当取出元素后,数组的靠前位置空出来,添加依旧是从尾部添加,所以数组如何保证取元素的正确性?
front<=rear且当front=rear时,数组刷新一次,将front和rear归零?
还是当数组加满时进行刷新,将整个数组复制前移?

12.数组模拟队列的实现,class ArrayQueue

  • 数据结构,最大容量int maxSize,队列头int front,队列尾int rear,模拟队列的数组int[] arr

  • 构造器,初始化队列,传入最大容量maxSize=max,创建数组arr=new int[maxSize],front=-1,rear=-1

  • 方法isFull,判断队列是否满 return rear==maxSize-1;

  • 方法isEmpty,判断队列是否空 return rear==front;

  • 方法addQueue,判断是否满;添加数据到队列(rear++后添加数据)

数组模拟队列,环形队列_韩顺平听课笔记_循环队列_04

  • 方法getQueue,判断是否空(抛出异常,不能返回-1,throw本身会导致代码return);取出队列的数据(front++后取出数据)

数组模拟队列,环形队列_韩顺平听课笔记_循环队列_05

  • 方法showQueue,显示队列所有数据;判断是否空

数组模拟队列,环形队列_韩顺平听课笔记_添加数据_06

  • 方法headQueue,显示队列头数据,判断是否空;return arr[front+1]

数组模拟队列,环形队列_韩顺平听课笔记_环形队列_07

13.数组模拟队列实现2;Scanner接收用户输入;switch,判断用户操作;当前数组不能重复使用(假溢出)——>环形队列

14.数组模拟环形队列,取模%

数组模拟队列,环形队列_韩顺平听课笔记_添加数据_08

数组模拟队列,环形队列_韩顺平听课笔记_添加数据_09

15.数组模拟环形队列的实现CircleArrayQueue

  • 将普通队列想象成逻辑上的首位相连的圆环,把这个叫循环队列,在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize
  • 添加数据,直接加载rear位置,rear后移一位,且需要%运算

数组模拟队列,环形队列_韩顺平听课笔记_环形队列_10

数组模拟队列,环形队列_韩顺平听课笔记_数据_11

  • 取出数据,需要一个变量存放当前队列头的值,然后将队列头后移取模,最后方法返回变量值

数组模拟队列,环形队列_韩顺平听课笔记_数组_12

  • 显示队列所有数据,需要先求出当前队列中存放了几个值(环形队列,下标和实际位置不一致),从front开始遍历,

数组模拟队列,环形队列_韩顺平听课笔记_数组_13

数组模拟队列,环形队列_韩顺平听课笔记_数据_14

  • 显示头元素

数组模拟队列,环形队列_韩顺平听课笔记_循环队列_15

  • 构造器

数组模拟队列,环形队列_韩顺平听课笔记_循环队列_16

数组实现环形队列总结:
基于rear=front=0,maxSize,队列实际只能存储maxSize-1个值

  • 应用场景——>解决假溢出,数组无法复用的问题——>在逻辑上,将一个数组视为环形
  • 结构上的改变——>rear=front为了区分队列满或空,数组留一个空间——>空依靠rear==front判断满依靠(rear+1)%maxSize==front判断
  • 应用上的改变——>
    1.添加元素——>判断是否满,不满则能添加——>rear位置直接添加一个元素,rear=(rear+1)%maxSize(环形结构)
    2.得到当前环形队列的元素个数——>return (rear-front+maxSize)%maxSize(环形结构,+maxSize排除rear实际下标小于front的情况)
    3.显示当前队列所有元素——>从front开始,一直遍历(2.当前环形队列的元素个数)个位置的元素
    4.取出元素——>判断队列是否空——>新建一个变量x,存放当前arr[front]位置的值,front=(front+1)%maxSize,返回x

当maxSize=4,时
front={0,1,2,3}
rear={0,1,2,3}
(rear-front+maxSize)%maxSize={0,1,2,3}
通过满判断(rear+1)%maxSize=front,为数组预留一个空位置
当队列满时,rear指向的是空值