题目连接 LeetCode 641. 设计循环双端队列
题目
思路
用数组来进行模拟,定义 hh 为队头,tt 为队尾。
其中,tt 表示的含义为最后一个元素的下一个位置。(类似于stl容器的 end() )
假如一共有k个数,那么要进行0,1,2,……,k 一共 k + 1 种情况,所以要开k + 1大小的空间,其中会涉及到模运算,比如当队列没有元素的时候在队头插入一个元素,那么 hh 要减一,此时hh为-1,下表不可能出现负数,所以要对数组的长度取模,hh = (hh + 队列长度) % 队列长度。
代码
class MyCircularDeque {
vector <int> q;
int hh = 0;// 队头
int tt = 0;// 队尾,最后一个元素的下一个位置
public:
MyCircularDeque(int k) {
q.resize(k + 1);
}
int get(int x){
return (x + q.size()) % q.size();
}
bool insertFront(int value) {
if(isFull()) return false;
hh = get(hh - 1);
q[hh] = value;
return true;
}
bool insertLast(int value) {
if(isFull()) return false;
q[tt] = value;
tt = get(tt + 1);
return true;
}
bool deleteFront() {
if(isEmpty()) return false;
hh = get(hh + 1);
return true;
}
bool deleteLast() {
if(isEmpty()) return false;
tt = get(tt - 1);
return true;
}
int getFront() {
if(isEmpty()) return -1;
return q[hh];
}
int getRear() {
if(isEmpty()) return -1;
return q[get(tt - 1)];
}
bool isEmpty() {
return hh == tt;
}
bool isFull() {
return tt == get(hh - 1);
}
};