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

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

题目

Acwing 秋招每日一题 & LeetCode 641. 设计循环双端队列_第1张图片

思路

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

代码

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);
    }
};

你可能感兴趣的:(数据结构,STL,leetcode,算法)