【数据结构-队列】力扣641. 设计循环双端队列

设计实现双端队列。

实现 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 。

示例 1:

输入

"MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"

\[3\], \[1\], \[2\], \[3\], \[4\], \[\], \[\], \[\], \[4\], \[\]

输出

null, true, true, true, false, 2, true, true, true, 4

解释

MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3

circularDeque.insertLast(1); // 返回 true

circularDeque.insertLast(2); // 返回 true

circularDeque.insertFront(3); // 返回 true

circularDeque.insertFront(4); // 已经满了,返回 false

circularDeque.getRear(); // 返回 2

circularDeque.isFull(); // 返回 true

circularDeque.deleteLast(); // 返回 true

circularDeque.insertFront(4); // 返回 true

circularDeque.getFront(); // 返回 4

数组

cpp 复制代码
class MyCircularDeque {
public:
    int front = 0, rear = 0;
    vector<int> que;
    int capacity;
    MyCircularDeque(int k) {
        capacity = k + 1;
        que.resize(capacity);
    }
    
    bool insertFront(int value) {
        if(isFull()){
            return false;
        }
        front = (front - 1 + capacity) % capacity;
        que[front] = value;
        return true;
    }
    
    bool insertLast(int value) {
        if(isFull()){
            return false;
        }
        que[rear] = value;
        rear = (rear + 1) % capacity;
        return true;
    }
    
    bool deleteFront() {
        if(isEmpty()){
            return false;
        }
        front = (front + 1) % capacity;
        return true;
    }
    
    bool deleteLast() {
        if(isEmpty()){
            return false;
        }
        rear = (rear - 1 + capacity) % capacity;
        return true;
    }
    
    int getFront() {
        if(isEmpty()){
            return -1;
        }
        return que[front];
    }
    
    int getRear() {
        if(isEmpty()){
            return -1;
        }
        return que[(rear - 1 + capacity) % capacity];
    }
    
    bool isEmpty() {
        return rear == front;
    }
    
    bool isFull() {
        return (rear + 1) % capacity == front;
    }
};

这道题的做法和力扣622很相似,我们只需要添加deleteLast()getFront()两个方法即可。需要注意的是,在题解中,rear指向的是插入的位置,而front指向的是队列头元素的位置,所以在插入队头元素的时候要先移动front再插入,而插入队尾元素的时候先插入再移动rear。

相关推荐
Grey Zeng9 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
雨白10 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
架构师沉默14 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群16 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL17 小时前
JVM 类加载:双亲委派机制
java·后端
用户2986985301417 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥17 小时前
原来公平锁和非公平锁差别这么大
java
渣哥18 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K18 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty72518 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构