设计实现双端队列。
实现
MyCircularDeque
类:
MyCircularDeque(int k)
:构造函数,双端队列最大为k
。boolean insertFront()
:将一个元素添加到双端队列头部。 如果操作成功返回true
,否则返回false
。boolean insertLast()
:将一个元素添加到双端队列尾部。如果操作成功返回true
,否则返回false
。boolean deleteFront()
:从双端队列头部删除一个元素。 如果操作成功返回true
,否则返回false
。boolean deleteLast()
:从双端队列尾部删除一个元素。如果操作成功返回true
,否则返回false
。int getFront()
:从双端队列头部获得一个元素。如果双端队列为空,返回-1
。int getRear()
:获得双端队列的最后一个元素。 如果双端队列为空,返回-1
。boolean isEmpty()
:若双端队列为空,则返回true
,否则返回false
。boolean isFull()
:若双端队列满了,则返回true
,否则返回false
。
思路:
使用固定数组实现:
成员变量:int * que;int head;int tail;int limit;int size;
函数:
MyCircularDeque(int k)
:初始化成员变量,设置que和limit的大小boolean isEmpty()
:若size==0,则返回true
,否则返回false
。boolean isFull()
:若size==limit,则返回true
,否则返回false
。boolean insertFront()
:判满后将元素插入到head前并更新headboolean insertLast()
:判满后将元素插入到tail前并更新tailboolean deleteFront()
:判空后++headboolean deleteLast()
判空后--tailint getFront()
:从双端队列头部获得一个元素。如果双端队列为空,返回-1
。int getRear()
:获得双端队列的最后一个元素。 如果双端队列为空,返回-1
。注意控制边界情况,使head可以从尾++后到头,tail可以从头--后到尾
代码:
class MyCircularDeque {
public:
MyCircularDeque(int k) {
que=new int[k];
head=tail=0;
size=0,limit=k;
}
bool insertFront(int value) {
if(isFull())return false;
que[head--]=value;
head=head==-1?limit-1:head;
++size;
return true;
}
bool insertLast(int value) {
if(isFull())return false;
tail=tail==limit-1?0:tail+1;
que[tail]=value;
++size;
return true;
}
bool deleteFront() {
if(isEmpty())return false;
++head;
head=head==limit?0:head;
--size;
return true;
}
bool deleteLast() {
if(isEmpty())return false;
--tail;
tail=tail==-1?limit-1:tail;
--size;
return true;
}
int getFront() {
if(isEmpty())return -1;
if(head==limit-1)return que[0];
return que[head+1];
}
int getRear() {
if(isEmpty())return -1;
return que[tail];
}
bool isEmpty() {
return size==0;
}
bool isFull() {
return size==limit;
}
int* que;
int head;
int tail;
int size;
int limit;
};