环形队列

讲真,这个东西有点绕.沉下心看,然后自己手动实现代码,一点一点摸索.图自己画的,学习的过程中也可以自己画个图,比较简单的,只要你去做

环形队列

什么是环形队列

简言之就是我们平时的排队,那个就是环形队列.虽然看着不是环形的,但是模拟成问题就是一个环形队列的问题.
如下图示例

在这里插入图片描述
图示已经很清楚了,这里就不在进行解释了.

代码实现
package name.dancer.array;

import java.io.Serializable;

/**
 * 环形队列
 * @author dancer
 * @date 2019-07-19
 * @description
 *      釜山行看过没?躲过了六节车厢的丧尸,却躲不过一节车厢的人心,所以证明了
 *                                                                       -- 一节更比六节强
 **/
public class RingArrayQuere<E> implements Serializable {

    private static final long serialVersionUID = -4396411833336571619L;

    /**
     *  队首
     */
    private int front;

    /**
     *  队尾
     */
    private int rear;

    /**
     *  容器大小
     */
    private int size;

    /**
     * 容器
     */
    private Object[] elementData;

    public RingArrayQuere(int size) {
        this.size = size + 1;
        elementData = new Object[this.size];
    }

    /**
     * 添加元素到对垒
     * @param e 要添加到队列中的元素
     * @return boolean
     */
    public boolean add(E e) {
        if (isFull()) {
            System.out.println("队列已满!");
            return false;
        }
        elementData[rear] = e;
        rear = (rear + 1) % size;
        return true;
    }

    /**
     * 获取队首的元素
     * @return e 队列中队首的元素
     */
    @SuppressWarnings("unchecked")
    public E get() {
        // 判断队列是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列為空!");
        }
        E temp = (E) elementData[front];

        front = (front + 1) % size;
        return temp;
    }

    /**
     * 获取当前队列的有效元素个数
     * @return 有效元素个数
     */
    public int effictiveDataSize() {
        return (rear + size - front) % size;
    }


    /**
     * 判断队列是否为空
     * @return boolean
     */
    private boolean isEmpty() {
        return rear == front;
    }

    /**
     * 判断队列是否满
     * @return boolean
     */
    private boolean isFull() {
        return (rear + 1) % size == front;
    }


    public static void main(String[] args) {
        RingArrayQuere<Integer> list = new RingArrayQuere<>(4);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println(list.get());
        System.out.println(list.get());
        System.out.println(list.get());
        System.out.println(list.get());
        list.add(5);
        list.add(6);
        System.out.println(list.effictiveDataSize());
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值