0
点赞
收藏
分享

微信扫一扫

LeetCode_Queue_622. Design Circular Queue 设计循环队列(C++/Java)


目录

​​一,题目描述​​

​​英文描述​​

​​中文描述​​

​​二,解题思路​​

​​三,AC代码​​

​​C++​​

​​Java​​

​​四,解题过程​​

​​第一博​​

一,题目描述

英文描述

Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called "Ring Buffer".

One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.

Implementation the MyCircularQueue class:

MyCircularQueue(k) Initializes the object with the size of the queue to be k.
int Front() Gets the front item from the queue. If the queue is empty, return -1.
int Rear() Gets the last item from the queue. If the queue is empty, return -1.
boolean enQueue(int value) Inserts an element into the circular queue. Return true if the operation is successful.
boolean deQueue() Deletes an element from the circular queue. Return true if the operation is successful.
boolean isEmpty() Checks whether the circular queue is empty or not.
boolean isFull() Checks whether the circular queue is full or not.
You must solve the problem without using the built-in queue data structure in your programming language. 


Example 1:

Input
["MyCircularQueue", "enQueue", "enQueue", "enQueue", "enQueue", "Rear", "isFull", "deQueue", "enQueue", "Rear"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 3, true, true, true, 4]

Explanation
MyCircularQueue myCircularQueue = new MyCircularQueue(3);
myCircularQueue.enQueue(1); // return True
myCircularQueue.enQueue(2); // return True
myCircularQueue.enQueue(3); // return True
myCircularQueue.enQueue(4); // return False
myCircularQueue.Rear();     // return 3
myCircularQueue.isFull();   // return True
myCircularQueue.deQueue();  // return True
myCircularQueue.enQueue(4); // return True
myCircularQueue.Rear();     // return 4
 

Constraints:

1 <= k <= 1000
0 <= value <= 1000
At most 3000 calls will be made to enQueue, deQueue, Front, Rear, isEmpty, and isFull.

中文描述

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
 

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4
 

提示:

所有的值都在 0 至 1000 的范围内;
操作数将在 1 至 1000 的范围内;
请不要使用内置的队列库。


二,解题思路

四个变量:

  • vector数组,模拟循环队列;
  • head,指向头部;
  • tail,指向尾部
  • cnt,标明当前队列中元素数目;

头部所指第一个元素,尾部所指最后一个元素的后一个位置,形成左闭右开的格局。

入队、出队操作中移动头尾指针有一个技巧:%取余(3%5=3,6%5=1,10%5=0)。不熟悉的同学可以自行搜索。

其他就没有什么需要说明的地方了。

三,AC代码

C++

class MyCircularQueue {
public:
vector<int> arr;
// 队头指向元素,队尾指向空(左闭右开)
int head, cnt, tail;
MyCircularQueue(int k) {
arr.resize(k);
head = 0;
cnt = 0;
tail = 0;
}

bool enQueue(int value) {
if (isFull()) return false;
arr[tail] = value;
tail = (tail + 1) % arr.size();
cnt++;
return true;
}

bool deQueue() {
if (isEmpty()) return false;
head = (head + 1) % arr.size();
cnt--;
return true;
}

int Front() {
return isEmpty() ? -1 : arr[head];
}

int Rear() {
return isEmpty() ? -1 : arr[(tail - 1 + arr.size()) % arr.size()];
}

bool isEmpty() {
return cnt == 0;
}

bool isFull() {
return cnt == arr.size();
}
};

Java

class MyCircularQueue {
int[] arr;
int head, tail, cnt;
public MyCircularQueue(int k) {
arr = new int[k];
head = 0;
tail = 0;
cnt = 0;
}

public boolean enQueue(int value) {
if (isFull()) return false;
arr[tail] = value;
tail = (tail + 1) % arr.length;
cnt++;
return true;
}

public boolean deQueue() {
if (isEmpty()) return false;
head = (head + 1 ) % arr.length;
cnt--;
return true;
}

public int Front() {
return isEmpty() ? -1 : arr[head];
}

public int Rear() {
return isEmpty() ? -1 : arr[(tail - 1 + arr.length) % arr.length];
}

public boolean isEmpty() {
return cnt == 0;
}

public boolean isFull() {
return cnt == arr.length;
}
}

四,解题过程

第一博

一发入魂,还好底子还在(●'◡'●)

LeetCode_Queue_622. Design Circular Queue 设计循环队列(C++/Java)_leetcode

举报

相关推荐

0 条评论