力扣622 设计循环队列

68 阅读1分钟
class MyCircularQueue {
public:
    int capcaity;
    int length;
    int top;
    int rear;
    vector<int>vec;
    MyCircularQueue(int k) :vec(k){
        capcaity=k;
        length=0;
        top=0;
        rear=0;
        }
    
    bool enQueue(int value) {
        if((length+1)>capcaity)  return false;//队满返回false
        length++;//入队长度+1
        rear=rear%capcaity+1;
/*rear为队列中最后一个元素下一个元素的索引
rear一直增加肯定会越界,当容器末尾也放了元素,再次入队的时候,索引应该为1
边界条件:
刚开始入队 当队列有第一个元素时 该元素在vec[0],rear就为1
当队列的元素到达容器末尾的时候入队,rear未更新前的值为capcaity-1,入队的更新后为
capcaity,不为0,虽然不符合rear始终为队尾元素下一个元素的索引,但是无关紧要,下次
入队rear就会为1,这里可以理解为capcaity和0两个索引作用是一样的,可能说的不清楚,可
以自己举例子想想*/
        vec[rear-1]=value;//队尾元素索引为rear-1
        return true;
        }
    
    bool deQueue() {
        if(length==0) return false;
        length--;
        top=(top+1)%capcaity;
/*top就是队首元素的索引 要是一直++肯定越界,当到达top到达容器末尾,下一次出队,top应该要返回到0
上式满足*/
        return true;
        }
    
    int Front() {
        if(length==0)   return -1;
        return vec[top];
         }
    
    int Rear() {
        if(length==0)  return -1;
        return vec[rear-1];
         }
    
    bool isEmpty() {
        if(length==0) return true;
        else return false;
          }
    
    bool isFull() {
        if(length==capcaity) return true;
        else return false;
          }
};