携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
痛苦周一,领导出差,因为断电导致服务器宕机,修了一上午没解决,网络问题
设计循环双端队列
该题出自力扣的641题 —— 设计循环双端队列【中等题】,这道题和之前有一道题比较相似,但是加了相关的条件
审题
- 该题并不困难,因为之前也做过类似的,不过当时并不要求是双端队列
- 虽然可以用现成的数据结构,linkedList或者Dueue也可以,但是毕竟是考验数据结构的题目
- 定义一个数组,充当队列的底层架构
- 定义三个变量,头指针,尾指针,已存放长度
- 这次不使用取余的方式去计算位置,虽然取余会更加优雅,但是对于可读性来说就有点困难(当然也是因为本身菜)
- 判断头尾指针的边界
- 头指针判断是否处于首位,也就是0,如果是则跨边界去长度 - 1的下标,因为是循环队列
- 尾指针判断是否处于末位,也就是长度 -1,如果是则跨边界去0
编码
class MyCircularDeque {
public MyCircularDeque(int k) {
queue = new int[k];
tail = k -1;
}
int[] queue;
int size = 0,head =0,tail = 0;
/**
* boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
* @param value
* @return
*/
public boolean insertFront(int value) {
if (isFull()){
return false;
}
queue[head = head == 0?queue.length - 1 : head - 1] = value;
size++;
return true;
}
/**
* boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
* @param value
* @return
*/
public boolean insertLast(int value) {
if (isFull()){
return false;
}
queue[tail = tail == queue.length - 1?0 : tail + 1] = value;
size++;
return true;
}
/**
* boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false
* @return
*/
public boolean deleteFront() {
if (isEmpty()){
return false;
}
head = head == queue.length - 1?0:head + 1;
size--;
return true;
}
public boolean deleteLast() {
if (isEmpty()){
return false;
}
tail = tail == 0?queue.length - 1:tail - 1;
size--;
return true;
}
/**
* int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1
* @return
*/
public int getFront() {
return isEmpty()?-1:queue[head];
}
/**
* int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
* @return
*/
public int getRear() {
return isEmpty()?-1:queue[tail];
}
/**
* boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false 。
* @return
*/
public boolean isEmpty() {
return size == 0;
}
/**
* boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。
* @return
*/
public boolean isFull() {
return size == queue.length;
}
}