【环形队列】

一.简介

因为普通队列大小是固定值,在添加数据或取出数据之后,由于不是闭环,所以会报越界的异常,也就是说这个队列只能使用一次,因此环形队列更适合。举例如下:
Front代表队列的第一个元素,初始值为0;
rear代表队列的最后一个元素+1,(即预留一个空间的位置),rear的初始值为0;
判断队列是否是满的:(real+1)% maxsize == front(即rear+1和front所指的是同一个区域);(看做rear追赶front);
判断是否是空:rear==front(可以看做是front追赶rear,这样便于理解);
队列中的有效数据的个数:(rear+maxsize-front)%maxsize

在这里插入图片描述

二.相关方法

注:这些方法和属性都是在一个类中

一 创建相关属性和构造器

 //队列最大数量
        private int maxSize;
        //队列头(指向第一个元素,初始值为0)
        private int front;
        //队列尾部(指向最后一个元素+1,初始值为0)
        private int rear;
        //队列
        private int[] arr;

        public Quere(int arrSize){
            maxSize = arrSize;
            arr = new int[maxSize];
            front=0;
            rear=0;
        }

二.判断队列是否已满

 public Boolean isFull(){
            return (rear+1) % maxSize ==front;
        }

三.判断队列是否为空

public Boolean isNull(){
            return rear == front;
        }

四.添加队列数据

 public void add(int n){
            //先判断队列是否是满的
            if (isFull()){
                System.out.println("队列已满,不能添加");
                return;
            }
            //加入数据
            arr[rear] = n;
            rear = (rear+1) % maxSize;//rear要后移,取模才会重新指向前端,否则可能会报越界
        }

五.取出数据

public int get(int n){
            //先判断队列是否是空的
            if (isNull()){
                throw new RuntimeException("队列是空的,没有值可以取出");
            }
            //1.先把front对应的值保留到一个临时变量
            int value = arr[front];
            //2.将front后移,(取模后移)
            front = (front+1)%maxSize;
            //3.将临时变量返回
            return value;
        }

六.显示数据

   public void show(int n){
            //先判断队列是否是空的
            if (isNull()){
                throw new RuntimeException("队列是空的,没有值可以取出");
            }
            for (int i = front; i < front +size(); i++) {
                System.out.print("arr["+i%maxSize+"] = "+arr[i%maxSize] );
            }
        }

        //求出当前队列的有效值个数
        public  int size(){
            return (rear+maxSize-front)%maxSize;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值