Acwing 秋招每日一题 & LeetCode 641. 设计循环双端队列

题目连接 LeetCode 641. 设计循环双端队列

题目

在这里插入图片描述

思路

用数组来进行模拟,定义 hh 为队头,tt 为队尾。
其中,tt 表示的含义为最后一个元素的下一个位置。(类似于stl容器的 end() )
假如一共有k个数,那么要进行0,1,2,……,k 一共 k + 1 种情况,所以要开k + 1大小的空间,其中会涉及到模运算,比如当队列没有元素的时候在队头插入一个元素,那么 hh 要减一,此时hh为-1,下表不可能出现负数,所以要对数组的长度取模,hh = (hh + 队列长度) % 队列长度。
在这里插入图片描述

代码

class MyCircularDeque {
    vector <int> q;
    int hh = 0;// 队头
    int tt = 0;// 队尾,最后一个元素的下一个位置
public:
    MyCircularDeque(int k) {
        q.resize(k + 1);
    }
    
    int get(int x){
        return (x + q.size()) % q.size();
    }

    bool insertFront(int value) {
        if(isFull()) return false;

        hh = get(hh - 1);

        q[hh] = value;
        
        return true;
    }
    
    bool insertLast(int value) {
        if(isFull()) return false;

        q[tt] = value;

        tt = get(tt + 1);
        return true;
    }
    
    bool deleteFront() {
        if(isEmpty()) return false;

        hh = get(hh + 1);
        return true;
    }
    
    bool deleteLast() {
        if(isEmpty()) return false;

        tt = get(tt - 1);
        return true;
    }
    
    int getFront() {
        if(isEmpty()) return -1;
        return q[hh];
    }
    
    int getRear() {
        if(isEmpty()) return -1;
        return q[get(tt - 1)];
    }
    
    bool isEmpty() {
        return hh == tt;
    }
    
    bool isFull() {
        return tt == get(hh - 1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值