循环队列有很多用处
实现方式也有很多种
下面的实现因为有取 rear 的操作所以实现的没那么优美
如果没有取 rear的操作,可以取一个节点为 不可用节点
rear == front 链表空
rear->next = front 链表满
/*
* 单线程
*
*
* */
class MyCircularQueue {
private:
struct ListNode {
int val;
ListNode *next;
};
ListNode *front;
ListNode *rear;
bool empty;
public:
MyCircularQueue(int k) {
front = new ListNode;
rear = front;
for (int i = 0; i < k - 1; i++) {
ListNode *node = new ListNode;
rear->next = node;
rear = node;
}
rear->next = front;
rear = front;
empty = true;
}
~MyCircularQueue() {
ListNode* node = this->rear;
node->next = nullptr;
node = this->front;
while (node) {
ListNode* next = node->next;
delete node;
node = next;
}
}
bool enQueue(int value) {
if (isFull()) {
return false;
}
if (isEmpty()) {
empty = false;
} else {
rear = rear->next;
}
rear->val = value;
return true;
}
bool deQueue() {
if (isEmpty()) {
return false;
}
if (front == rear) {
empty = true;
return true;
}
front = front->next;
return true;
}
int Front() {
if (isEmpty()) {
return -1;
}
return front->val;
}
int Rear() {
if (isEmpty()) {
return -1;
}
return rear->val;
}
bool isEmpty() {
return empty;
}
bool isFull() {
return !empty && rear->next == front;
}
};