Design your implementation of the circular double-ended queue (deque).

Your implementation should support following operations:

MyCircularDeque(k): Constructor, set the size of the deque to be k.
insertFront(): Adds an item at the front of Deque. Return true if the operation is successful.
insertLast(): Adds an item at the rear of Deque. Return true if the operation is successful.
deleteFront(): Deletes an item from the front of Deque. Return true if the operation is successful.
deleteLast(): Deletes an item from the rear of Deque. Return true if the operation is successful.
getFront(): Gets the front item from the Deque. If the deque is empty, return -1.
getRear(): Gets the last item from Deque. If the deque is empty, return -1.
isEmpty(): Checks whether Deque is empty or not.
isFull(): Checks whether Deque is full or not.

Example:

MyCircularDeque circularDeque = new MycircularDeque(3); // set the size to be 3
circularDeque.insertLast(1); // return true
circularDeque.insertLast(2); // return true
circularDeque.insertFront(3); // return true
circularDeque.insertFront(4); // return false, the queue is full
circularDeque.getRear(); // return 2
circularDeque.isFull(); // return true
circularDeque.deleteLast(); // return true
circularDeque.insertFront(4); // return true
circularDeque.getFront(); // return 4

Note:

All values will be in the range of [0, 1000].
The number of operations will be in the range of [1, 1000].
Please do not use the built-in Deque library.

622.Design Circular Queue 的拓展。

解法:doubly Linked List

Java:

class MyCircularDeque {
int size;
int k;
DoubleListNode head;
DoubleListNode tail;
/** Initialize your data structure here. Set the size of the deque to be k. */
public MyCircularDeque(int k) {
head = new DoubleListNode(-1);
tail = new DoubleListNode(-1);
head.pre = tail;
tail.next = head;
this.k = k;
this.size = 0;
} /** Adds an item at the front of Deque. Return true if the operation is successful. */
public boolean insertFront(int value) {
if (size == k)
return false;
DoubleListNode node = new DoubleListNode(value);
node.next = head;
node.pre = head.pre;
head.pre.next = node;
head.pre = node;
size++;
return true;
} /** Adds an item at the rear of Deque. Return true if the operation is successful. */
public boolean insertLast(int value) {
if (size == k)
return false;
DoubleListNode node = new DoubleListNode(value);
node.next = tail.next;
tail.next.pre = node;
tail.next = node;
node.pre = tail;
size++;
return true;
} /** Deletes an item from the front of Deque. Return true if the operation is successful. */
public boolean deleteFront() {
if (size == 0)
return false;
head.pre.pre.next = head;
head.pre = head.pre.pre;
size--;
return true;
} /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
public boolean deleteLast() {
if (size == 0)
return false;
tail.next.next.pre = tail;
tail.next = tail.next.next;
size--;
return true;
} /** Get the front item from the deque. */
public int getFront() {
return head.pre.val;
} /** Get the last item from the deque. */
public int getRear() {
return tail.next.val;
} /** Checks whether the circular deque is empty or not. */
public boolean isEmpty() {
return size == 0;
} /** Checks whether the circular deque is full or not. */
public boolean isFull() {
return size == k;
}
} class DoubleListNode {
DoubleListNode pre;
DoubleListNode next;
int val;
public DoubleListNode(int val) {
this.val = val;
}
}

Python:

class Node:
def __init__(self, value):
self.val = value
self.next = self.pre = None class MyCircularDeque: def __init__(self, k):
self.head = self.tail = Node(-1)
self.head.next = self.tail
self.tail.pre = self.head
self.size = k
self.curSize = 0 def add(self, value, preNode):
new = Node(value)
new.pre = preNode
new.next = preNode.next
new.pre.next = new.next.pre = new
self.curSize += 1 def remove(self, preNode):
node = preNode.next
node.pre.next = node.next
node.next.pre = node.pre
self.curSize -= 1 def insertFront(self, value):
if self.curSize < self.size:
self.add(value, self.head)
return True
return False def insertLast(self, value):
if self.curSize < self.size:
self.add(value, self.tail.pre)
return True
return False def deleteFront(self):
if self.curSize:
self.remove(self.head)
return True
return False def deleteLast(self):
if self.curSize:
self.remove(self.tail.pre.pre)
return True
return False def getFront(self):
if self.curSize:
return self.head.next.val
return -1 def getRear(self):
if self.curSize:
return self.tail.pre.val
return -1 def isEmpty(self):
return self.curSize == 0 def isFull(self):
return self.curSize == self.size

C++:  

#include <vector>
#include <iostream> using namespace std; class MyCircularDeque {
private:
vector<int> buffer;
int cnt;
int k;
int front;
int rear;
public:
/** Initialize your data structure here. Set the size of the deque to be k. */
MyCircularDeque(int k): buffer(k, 0), cnt(0), k(k), front(k - 1), rear(0) {
} /** Adds an item at the front of Deque. Return true if the operation is successful. */
bool insertFront(int value) {
if (cnt == k) {
return false;
}
buffer[front] = value;
front = (front - 1 + k) % k;
++cnt; return true;
} /** Adds an item at the rear of Deque. Return true if the operation is successful. */
bool insertLast(int value) {
if (cnt == k) {
return false;
}
buffer[rear] = value;
rear = (rear + 1) % k;
++cnt; return true;
} /** Deletes an item from the front of Deque. Return true if the operation is successful. */
bool deleteFront() {
if (cnt == 0) {
return false;
}
front = (front + 1) % k;
--cnt; return true;
} /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
bool deleteLast() {
if (cnt == 0) {
return false;
}
rear = (rear - 1 + k) % k;
--cnt; return true;
} /** Get the front item from the deque. */
int getFront() {
if (cnt == 0) {
return -1;
}
return buffer[(front + 1) % k];
} /** Get the last item from the deque. */
int getRear() {
if (cnt == 0) {
return -1;
}
return buffer[(rear - 1 + k) % k];
} /** Checks whether the circular deque is empty or not. */
bool isEmpty() {
return cnt == 0;
} /** Checks whether the circular deque is full or not. */
bool isFull() {
return cnt == k;
}
}; /**
* Your MyCircularDeque object will be instantiated and called as such:
* MyCircularDeque obj = new MyCircularDeque(k);
* bool param_1 = obj.insertFront(value);
* bool param_2 = obj.insertLast(value);
* bool param_3 = obj.deleteFront();
* bool param_4 = obj.deleteLast();
* int param_5 = obj.getFront();
* int param_6 = obj.getRear();
* bool param_7 = obj.isEmpty();
* bool param_8 = obj.isFull();
*/ #if DEBUG
int main(int argc, char** argv) {
return 0;
}
#endif

  

  

类似题目:

[LeetCode] 622.Design Circular Queue 设计环形队列

All LeetCode Questions List 题目汇总

[LeetCode] 641.Design Circular Deque 设计环形双向队列的更多相关文章

  1. [LeetCode] Design Circular Deque 设计环形双向队列

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

  2. [LeetCode] 622.Design Circular Queue 设计环形队列

    Design your implementation of the circular queue. The circular queue is a linear data structure in w ...

  3. LeetCode 641. Design Circular Deque

    原题链接在这里:https://leetcode.com/problems/design-circular-deque/ 题目: Design your implementation of the c ...

  4. [LeetCode] Design Circular Queue 设计环形队列

    Design your implementation of the circular queue. The circular queue is a linear data structure in w ...

  5. LC 641. Design Circular Deque

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

  6. 【LeetCode】641. Design Circular Deque 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/design-ci ...

  7. Leetcode641.Design Circular Deque设计循环双端队列

    设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头部. 如果操作成功返回 tr ...

  8. LeetCode 622. Design Circular Queue

    原题链接在这里:https://leetcode.com/problems/design-circular-queue/ 题目: Design your implementation of the c ...

  9. [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

随机推荐

  1. python 获取当前,上级,上上级路径

    import os print '***获取当前目录***' print os.getcwd() print os.path.abspath(os.path.dirname(__file__)) pr ...

  2. 前端性能----从输入URL开始到返回数据的中间经历过程

    这是一个古老的问题,即我们输入URL后按下回车到网页测呈现都发生了什么? 首先来看一张图: 表示了数据从源端到目的端的封装和拆解过程 预处理URL URL格式:  以http为例: http://ww ...

  3. sublme text 3 快捷键

    1. 插件 codeFormatter 格式化插件 json格式化MAC快捷键  control + option + F

  4. uni验证码60秒倒计时

    其实要实现这个功能原理非常简单,就是setInterval+setTimeout+clearInterval结合使用,首先在data里定义一个变量second,初始值为60,然后在setInterva ...

  5. 洛谷 P2577 [ZJOI2005]午餐 题解

    每日一题 day56 打卡 Analysis 算法:贪心+dp 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 然后就是dp了: 首先,应该想到f[i][j][k]:前i个 ...

  6. php实现隔行换色

    <?php $i = 0 ; //声明一个变量 echo "<table width='800' border='1px'>"; //表格开头 设置宽度边框 wh ...

  7. typedi 强大的javascript以及typescript 依赖注入框架

    typedi 是typestack团队提供的依赖注入解决方案,对于typescript 我们可以使用注解的开发方式,官方的文档也比较详细 javascript 使用 基于函数的服务注入 var Ser ...

  8. minio gataway 模式快速提供s3 兼容的文件服务

    实际很多场景我们已经有了遗留系统的文件存储方式(ftp,或者共享目录),但是这个方式可能不是很好,对于web 不是很友好 实际上minio 也提供了gateway 的模式,可以方便快速的将遗留系统的存 ...

  9. 迁移模型问题,提示admin已存在

    在部署的时候迁移文件的时候提示 django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_i ...

  10. uni-app 网络请求

    uni.request发起网络请求 url 开发者服务器接口地址 data 请求的参数 header method dataType responseType 设置响应的数据类型 statusCode ...