622. Design Circular Queue (Medium)
设计并实现一个循环队列。循环队列是一个线性数据结构,遵循先进先出原则,队列头尾相互连接形成一个环,也叫做环形缓冲区(Ring Buffer)。
在常规队列中,一旦队列满了也就无法再添加元素入列,就算队列头前面存在空位。但是使用循环队列,无论空位在队列头的前面还是后面,只要存在空位就可以被利用上。
这道题要求实现的循环队列要有下面的方法:
MyCircularQueue(k)以指定值k初始化队列大小int Front()返回队列头的元素,如果队列为空则返回-1int Rear()返回队列尾的元素,如果队列为空则返回-1boolean enQueue(int value)添加新的元素入列,如果成功则返回trueboolean deQueue()让队列头元素出列,如果成功则返回trueboolean isEmpty()检查队列是否为空boolean isFull()检查队列是否已满
思路
按照每个方法分别讨论一下思路,这道题的注意点在于索引是循环的,我们通过取模来保证索引不会超过数组长度。
MyCircularQueue(k)
初始化时只需要准备一个指定长度的数组,初始化队列头尾的指针即可。将 k 的值保留,后续需要使用它来取模。
int Front()
对于返回队列头的逻辑,我们只需要判断当前队列是否为空:为空时返回 -1;否则返回队列头指针对应的元素。
int Rear()
对于返回队列尾的逻辑,我们只需要判断当前队列是否为空:为空时返回 -1;否则返回队列尾指针对应的元素。
boolean enQueue(int value)
入列逻辑需要考虑几个条件。
- 如果当前队列已满直接返回
False; - 继续判断如果队列为空则将值放在
0位置,将队列头尾指针都置为0; - 否则给队列尾指针右移一个位置,将新的值放在对应位置。
- 指针向右移动时给尾指针的值
+1,这可能会造成指针的值超过数组长度,所以还需将其与k取模。
- 指针向右移动时给尾指针的值
boolean deQueue()
出列逻辑相似。
- 如果当前队列为空直接返回
False; - 继续判断如果当前头尾指针指向同一个元素,则将 2 个指针都置为
-1; - 否则将头指针向右移一个位置。
- 指针向右移动时给头指针的值
+1,这可能会造成指针的值超过数组长度,所以还需将其与k取模。
- 指针向右移动时给头指针的值
boolean isEmpty()
检查队列是否为空我们只需要检查 2 个指针是否为 -1。实际上如果一个指针为 -1 时,另一个同样也必须为 -1,所以实际上我们只需要判断头指针是否为 -1。
boolean isFull()
检查队列是否已满我们可以判断尾指针与头指针是否相差 1 个单位。可以手动计算尾指针加 1 后的值是够等于头指针,需要注意指针的值增加可能会导致超过长度 k,所以在对比头指针之前还需要做取模操作。
class MyCircularQueue: |
相关文章