循环队列的总结

循环队列基于数组实现
front:指向循环队列的第一个元素索引
tail:指向循环队列的最后一个元素的下一个位置
注意:当要存储的元素个数为K,则数组大小要开辟k+1,需要浪费一个空间

判断当前循环队列为空:front = tail
判断当前循环队列为满:(tail+1)%data.length = front
每次front和tail添加或者删除元素向后移动:
(front+1)%data.length
(tail+1)%data.length

取模的核心:当走到末尾时继续从头开始入队和出队,形成循环

具体实现如下:

public class LoopQueue implements Queue{

    private int[] data;
    //有效元素个数
    private int size;
    //指向队首元素下标
    private int front;
    //指向队尾元素的下一个位置下标
    private int tail;

    public LoopQueue(int k) {
        data = new int[k + 1];
    }

    @Override
    public void offer(int value) {
        if (isFull()){
            System.err.println("queue is full!");
            return;
        }
        data[tail] = value;
        tail = (tail + 1) % data.length;
        size ++;
    }

    @Override
    public int poll() {
        if (isEmpty()){
            System.err.println("queue is empty!");
            return -1;
        }
        int value = data[front];
        front = (front + 1) % data.length;
        size --;
        return value;
    }

    @Override
    public int peek(){
        if (isEmpty()){
            System.err.println("queue is empty!");
            return -1;
        }
        return data[front];
    }

    public boolean isFull(){
        if ((tail + 1) % data.length == front){
            return true;
        }
        return false;
    }

    public boolean isEmpty(){
        return tail == front;
    }

    public int getSize(){
        return size;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();;
        sb.append("front [");
        //遍历循环队列
        for (int i = front; i != tail;) {
            sb.append(data[i]);
            int lastIndex = tail == 0 ? data.length - 1 : tail - 1;
            if(i != lastIndex){
                sb.append(",");
            }
            i = (i + 1) % data.length;
        }
        sb.append("] tail");
        return sb.toString();
    }

    public static void main(String[] args) {
        LoopQueue loopQueue = new LoopQueue(3);
        loopQueue .offer(1);
        loopQueue .offer(3);
        loopQueue .offer(5);
        System.out.println(loopQueue);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值