自定义循环队列 (LoopQueue)

front==tail 队列为null
(tail+1)%capacity = front 队列满


/*
循环队列
front==tail  队列为null
front :首位的index
tail: 队列后的null位置

tail+1=front 或者 (tail+1) %c  = front队列满
 */
public class LoopQueue<E> implements Queue<E> {
    E [] data;
    int front,tail;
    int size;

    public LoopQueue() {
        this(10);
    }

    /**
     * 总容积 比真正可以保存数据的个数多1
     * @param capacity
     */
    public LoopQueue(int capacity) {
        this.data = (E[]) new Object[capacity+1];
        front=0;
        tail=0;
        size=0;
    }
    public int getCapacity(){
        return data.length-1;
    }

    @Override
    public int getSize() {
        return size;
    }

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

    //出队(删除首位数据)
    @Override
    public E dequeue() {
        if (isEmpty())
            throw  new IllegalArgumentException("Array is null");
        E e = data[front];
        data[front] = null;

        front= (front+1)%data.length;

        size--;
        if (size==getCapacity()/4&&getCapacity()/2!=0)
            resize(getCapacity()/2);
        return e;
    }

//    入队
    @Override
    public void enqueue(E e) {
        //控件满了
        if ((tail+1)% data.length==front){
            resize(getCapacity()*2);
        }

        data[tail] =e;

        tail = (tail+1)%data.length;
        size++;

    }

    private void resize(int capacity) {
        E [] newObj = (E[]) new Object[capacity+1];

        //循环队列第一位 赋值给新数组的第一位
        for (int i = 0; i < size; i++) {
            newObj[i] = data[(i+front)%data.length];
        }
        data = newObj;
        front=0;
        tail = size;

    }

    //获取队首
    @Override
    public E getFront() {
        if (isEmpty()){
            throw new IllegalArgumentException("array is null");
        }
        E e = data[front];
        return e;
    }

    @NonNull
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.append("LoopQueue");
        stringBuilder.append("   front:[");
        for (int i = front; i !=tail; i=(i+1)%data.length) {
            stringBuilder.append(data[i]);
            //不是最后一位
            if ((i+1)%data.length!=tail) {
                stringBuilder.append(", ");
            }
        }
        stringBuilder.append("] tail");
        return stringBuilder.toString();


    }

    public static void main(String[] args) {

        LoopQueue<Integer> loopQueue = new LoopQueue<Integer>();
        for (int i = 0; i < 10; i++) {
            loopQueue.enqueue(Integer.valueOf(i));
            System.out.println(loopQueue);

            if (i%3==2){
                loopQueue.dequeue();
                System.out.println(loopQueue);
            }
        }
    }
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c自定义队列类是一种数据结构,它遵循先进先出(FIFO)的原则。这个类可以适用于各种应用场景,例如任务调度、缓存管理等。 这个自定义队列类具有一些基本的属性和方法,以实现队列的操作。首先,它包含一个数组或链表,用于存储数据。还有两个指针,一个指向队列的头部,另一个指向队列的尾部。 队列类的主要方法包括入队(enqueue)和出队(dequeue)。入队操作将一个元素添加到队列的尾部,出队操作则删除并返回队列头部的元素。此外,还可以实现一些其他的方法,如判断队列是否为空(isEmpty)、获取队列的长度(size)等。 在队列类中,还可以实现一些其他的辅助方法。例如,获取队列头部的元素(front)、获取队列尾部的元素(rear)、清空队列(clear)等。这些方法可以根据具体的需求进行定义和实现。 自定义队列类应该具有良好的封装性和可复用性。它可以提供一些公共方法,供其他程序进行调用和使用。同时,也可以考虑对队列的容量进行限制,以避免对内存资源的过度占用。 总而言之,c自定义队列类是一种功能强大、可扩展性高的数据结构。通过合理设计和实现,它可以提供一些基本的队列操作,满足不同场景下的需要。同时,这个类也可以根据具体需求进行适应和扩展,以满足更为复杂的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值