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

相关推荐
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
星核0penstarry1 天前
DeepSeek-V4-Flash 正式公测:大模型行业进入「极速平价普惠时代」
java·开发语言·人工智能
xieliyu.1 天前
Java 线程池入门详解:线程池基础定义 + ThreadPoolExecutor 全参构造方法逐参数解析
java·开发语言·idea·javaee
老白干1 天前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
圆山猫1 天前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
城管不管1 天前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨1 天前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
豆瓣鸡1 天前
算法日记 - Day3
java·开发语言·算法
白白白小纯1 天前
算法篇—反转链表
c语言·数据结构·算法·leetcode
萧瑟余晖1 天前
Java深入解析篇九之NIO详解
java·网络·nio