循环队列
class MyCircularQueue {
int[] queue;
int front;
int rear;
int capacity;
/** Initialize your data structure here. Set the size of the queue to be k. */
public MyCircularQueue(int k) {
capacity = k + 1;
queue = new int[capacity];
// 队头指针指向第一个保存的元素位置
// 删除时,+1 (取模)
front = 0;
// 队尾指针指向下一个保存元素的位置
// 添加时,先赋值,再加 (取模)
rear = 0;
}
/** Insert an element into the circular queue. Return true if the operation is successful. */
public boolean enQueue(int value) {
if (isFull())
return false;
queue[rear] = value;
rear = (rear + 1 ) % capacity;
return true;
}
/** Delete an element from the circular queue. Return true if the operation is successful. */
public boolean deQueue() {
if (isEmpty())
return false;
front = (front + 1) % capacity;
return true;
}
/** Get the front item from the queue. */
public int Front() {
if (isEmpty())
return -1;
return queue[front];
}
/** Get the last item from the queue. */
public int Rear() {
if(isEmpty())
return -1;
return queue[(rear + capacity - 1) % capacity];
}
/** Checks whether the circular queue is empty or not. */
public boolean isEmpty() {
return front == rear;
}
/** Checks whether the circular queue is full or not. */
public boolean isFull() {
return (rear + 1) % capacity == front;
}
}
循环双端队列
class MyCircularDeque {
int[] queue;
int front;
int rear;
int capacity;
/** Initialize your data structure here. Set the size of the deque to be k. */
public MyCircularDeque(int k) {
capacity = k + 1;
queue = new int[capacity];
// 头部指向第 1 个存放元素的位置
// 插入时,先减,再赋值
// 删除时,索引 +1(注意取模)
front = 0;
// 尾部指向第一个尾插的后一个位置(空位置)
// 插入时,先赋值,再加
// 删除时,索引 -1(注意取模)
rear = 0;
}
/** Adds an item at the front of Deque. Return true if the operation is successful. */
public boolean insertFront(int value) {
if (!isFull()){
front = (front + capacity- 1) % capacity;
queue[front] = value;
return true;
}else{
return false;
}
}
/** Adds an item at the rear of Deque. Return true if the operation is successful. */
public boolean insertLast(int value) {
if (!isFull()){
queue[rear] = value;
rear = (rear + 1) % capacity;
return true;
}else{
return false;
}
}
/** Deletes an item from the front of Deque. Return true if the operation is successful. */
public boolean deleteFront() {
if (!isEmpty()){
front = (front + 1) % capacity;
return true;
}else{
return false;
}
}
/** Deletes an item from the rear of Deque. Return true if the operation is successful. */
public boolean deleteLast() {
if (!isEmpty()){
rear = (rear + capacity-1) % capacity;
return true;
}else{
return false;
}
}
/** Get the front item from the deque. */
public int getFront() {
if(!isEmpty()){
return queue[front];
}else{
return -1;
}
}
/** Get the last item from the deque. */
public int getRear() {
if(!isEmpty()){
return queue[(rear + capacity -1) % capacity];
}else{
return -1;
}
}
/** Checks whether the circular deque is empty or not. */
public boolean isEmpty() {
return front == rear;
}
/** Checks whether the circular deque is full or not. */
public boolean isFull() {
return (rear + 1) % capacity == front;
}
}