题目描述
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
1 2 3 4 5 6 7
| MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。 Rear: 获取队尾元素。如果队列为空,返回 -1 。 enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。 deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。 isEmpty(): 检查循环队列是否为空。 isFull(): 检查循环队列是否已满。
|
示例
1 2 3 4 5 6 7 8 9 10
| 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 的范围内;
- 请不要使用内置的队列库。
代码
数组实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| typedef struct Circul { int *data; int front; int rear; } Circul;
class MyCircularQueue { public: Circul qy; int len; MyCircularQueue(int k) { len = k+1; // 注意这里要加一,不加一会导致最大存储数少一位! qy.data = new int[len]; qy.front = qy.rear = 0; } bool enQueue(int value) { if (isFull()) return false; qy.data[qy.rear] = value; qy.rear = (qy.rear + 1) % len; return true; } bool deQueue() { if (isEmpty()) return false; qy.front = (qy.front + 1) % len; return true; } int Front() { if (isEmpty()) return - 1; return qy.data[qy.front]; } int Rear() { if (isEmpty()) return - 1; return qy.data[(qy.rear - 1 + len) % len]; } bool isEmpty() { if (qy.rear == qy.front) return true; return false; } bool isFull() { if ((qy.rear + 1) % len == qy.front) return true; return false; } };
|
链表实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class MyCircularQueue {
private: ListNode *head, *tail; int len, count;
public: MyCircularQueue(int k) { count = 0; len = k; tail = head = nullptr; } bool enQueue(int value) { if (isFull()) return false; ListNode *node = new ListNode(value); if (!head) { head = tail = node; } else { tail->next = node; tail = node; } ++count; return true; } bool deQueue() { if (isEmpty()) return false; ListNode *tmp = head; head = head->next; delete tmp; --count; return true; } int Front() { if (isEmpty()) return -1; return head->val; } int Rear() { if (isEmpty()) return -1; return tail->val; } bool isEmpty() { if (count == 0) return true; return false; } bool isFull() { if (count == len) return true; return false; } };
|
题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/design-circular-queue