【数据结构-队列】力扣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。

相关推荐
敖正炀7 小时前
深入对比 Java 并发工具:CyclicBarrier、CountDownLatch 与 Semaphore
java
橘子编程7 小时前
Tomcat全栈指南:从入门到精通
java·tomcat
hrhcode7 小时前
【java工程师快速上手go】三.Go Web开发(Gin框架)
java·spring boot·golang
田梓燊7 小时前
leetcode 234
算法·leetcode·职场和发展
敖正炀7 小时前
CountDownLatch 详解
java
海兰7 小时前
【Spring AI】从一个MCP小实例开始
java·人工智能·spring
Rick19937 小时前
Spring Boot自动装配原理
java·spring boot·后端
我命由我123457 小时前
Android Jetpack Compose - 组件分类:布局组件、交互组件、文本组件
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
Devin~Y7 小时前
大厂内容社区面试实录:从 Spring Boot 微服务到 AI RAG 问答(附详细解析)
java·spring boot·redis·elasticsearch·spring cloud·微服务·kafka
Lenyiin7 小时前
Python数据类型与运算符:深入理解Python世界的基石
java·开发语言·python