循环队列模拟


大体思路记得,但是具体细节有遗忘,可以参考:循环队列中判断队满与队空_循环队列判断队空和队满-CSDN博客

题目

代码都是自己写的,Debug 也是。

/**
    普通队列约定:
       1. hh == tt队空;但是容量有限
       2. 元素入队尾指针 q[tt++] = val  ; 队头元素,q[hh]; 出队元素头指针 ++hh;
    循环队列
        1. 队满 hh == (tt + 1) % Q_size;   //留一个位置判定满元素
        2. 队空 hh == tt; 
     */

class MyCircularQueue {
    //设计一个循环队列,一个空间用来存放两指针的交界,判断是为空还是满
    int[] MyQueue;
    int hh = 0, tt = 0;
    int size = 0 ;  //存元素个数
    int MAX_SIZE = 0;
    
    public MyCircularQueue(int k) {
        MyQueue = new int[k + 1];
        MAX_SIZE = k + 1;   //用来取模的队列长度; 注意是k + 1,因为一个位置要拿来取模
    }
    
    //元素入队
    public boolean enQueue(int value) {
        if(isFull()) return false;
        
        MyQueue[tt] = value;   //入队
        tt = (tt + 1) % MAX_SIZE;  //更新指针
        size++;  //更新容量
        return true;
    }
    
    //元素删除; 删除头部元素
    public boolean deQueue() {
        if(isEmpty()) return false;   //队空,删除失败
        hh = (hh + 1) % MAX_SIZE;
        size--;  //更新容量

        return true;
    }
    
    public int Front() {
        if(isEmpty()) return -1;   //队空,弹出元素失败
        return MyQueue[hh];
    }
    
    public int Rear() {
        if(isEmpty()) return -1;   //队空,弹出元素失败
        return MyQueue[(tt - 1 + MAX_SIZE) % MAX_SIZE];    //队尾稍微不太一样,因为可能会在0的位置,但是此时队列并空,所以要求和取模
    }
    
    //判定队空
    public boolean isEmpty() {
        return hh == tt;
    }
    
    //判定队满
    public boolean isFull() {
        return (tt + 1) % MAX_SIZE == hh;
    }
}

文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
评论
  目录