看题思路
一、抓住两个关键点:
关键点一: 对rear的位置做了怎样的要求?
一般对rear的位置有两种命题设置:
- 要求rear指向最后一个元素
- 要求rear指向最后一个元素的下一个位置
关键点二: 对队列判满做了什么样的要求?
队列的判空有三种方法:
- 牺牲元素判断队满
- 设置一个表示循环队列中元素个数的变量size判断队满
- 设置tag标记通过最后一次操作的性质(是入队还是出队)来判断队满 (不常考)
二、先看关键点一, 再看关键点二:
1. 要求rear指向最后一个元素时 (关键点一)
此时, 队列会有以下几个性质:
- 入队就是rear先加一, 再加入元素
- 循环队列的初始状态是rear=n-1、front=0
1.1 用size判断队满时 (关键点二):
rear==front
且size==n
为队满
给出rear和size, 计算front的公式: front = (1+rear+MAXSIZE-size)%MAXSIZE
计算队列元素个数公式: size
1.2 牺牲元素判断队满时 (关键点二):
rear后移两下若找到front则为队满
给出rear和元素个数size, 计算front的公式: front = (1+rear+MAXSIZE-size)%MAXSIZE
计算队列元素个数公式: (rear+1+MAXSIZE-front)%MAXSIZE
2. 要求rear指向最后一个元素的下一个位置时 (关键点一)
此时, 队列会有以下几个性质:
- 入队就是先加入元素, rear再加一
- 循环队列的初始状态是rear=0、front=0。
2.1 用size判断队满时 (关键点二):
rear==front
且size==n
为队满
给出rear和size, 计算front的公式: front = (rear+MAXSIZE-size)%MAXSIZE
计算队列元素个数公式: size
2.2 牺牲元素判断队满时 (关键点二):
rear后移一下若找到front为队满,
计算队列元素个数公式: (rear+MAXSIZE-front)%MAXSIZE
给出rear和元素个数size, 计算front的公式: front = (rear+MAXSIZE-size)%MAXSIZE
三、一个规律方便记忆与区分
在关键点一:要求rear指向最后一个元素时中所有的公式小括号里面都会有"+1"
根本原因是rear指向最后一个元素本身使得循环队列能比"rear指向最后一个元素的下一个位置时"的循环队列多存储一个元素。