题目
设计实现双端队列。
你的实现需要支持以下操作:
MyCircularDeque(k):构造函数,双端队列的大小为k。
insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
isEmpty():检查双端队列是否为空。
isFull():检查双端队列是否满了。
代码
public class LC641 {
int[] myqueue;
int front;
int real;
int size;
int myque;
public LC641(int k) {
this.myqueue=new int[k];
this.front=0;
this.real=0;
this.size=0;
this.myque=k;
}
/** Adds an item at the front of Deque. Return true if the operation is successful. */
public boolean insertFront(int value) {
if(front==real && size==myque) {
return false;
}else {
front=(front-1+myque)%myque;
myqueue[front]=value;
size++;
return true;
}
}
/** Adds an item at the rear of Deque. Return true if the operation is successful. */
public boolean insertLast(int value) {
if(front==real && size==myque) {
return false;
}else {
myqueue[real]=value;
real=(real+1+myque)%myque;
size++;
return true;
}
}
/** Deletes an item from the front of Deque. Return true if the operation is successful. */
public boolean deleteFront() {
if(front==real && size==0) {
return false;
}else {
front=(front+1+myque)%myque;
size--;
return true;
}
}
/** Deletes an item from the rear of Deque. Return true if the operation is successful. */
public boolean deleteLast() {
if(front==real && size==0) {
return false;
}else {
real=(real-1+myque)%myque;
size--;
return true;
}
}
/** Get the front item from the deque. */
public int getFront() {
if(front==real && size==0) {
return -1;
}else {
int a=myqueue[front];
return a;
}
}
/** Get the last item from the deque. */
public int getRear() {
if(front==real && size==0) {
return -1;
}else {
int b = myqueue[(real-1+myque)%myque];
return b;
}
}
/** Checks whether the circular deque is empty or not. */
public boolean isEmpty() {
if(front==real && size==0) {
return true;
}else {
return false;
}
}
/** Checks whether the circular deque is full or not. */
public boolean isFull() {
if(front==real && size==myque) {
return true;
}else {
return false;
}
}
思路
首先,用循环数组来实现这个双端队列。用front和real代表队列的头和尾。要说明的是front是指向头元素,而real是指向末尾元素后面的那个数组空间。所以当front与real相等时,队列可能是空的也可能是满的。
我们用size来表示数组中元素的个数,这样能判断队列是否为满,是否为空。
之后删除增加操作,front和real的前后移动用 (front±1)+数组长度 对 数组长度取余 来