通过数组实现的环形队列

通过数组实现的环形队列

通过数组实现的队列可以分为两种:
1.一种是取出后数组空间不可用的顺序队列。也就是普通队列,这种队列最大的好处就是实现简单,但取出后空间不可使用
2.另一种就是接下来我要说的环形队列,它通过改变队尾指向,将满队列队尾指向队首来实现循环队列

队列

队列是一种特殊的线性表,它通过表前端(front)进行删除操作,通过表后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队首。

操作图解

(1)判断是否为空

空队列
当队尾(rear)和队首(front)相等时,队列为空
初始化:rear=front=0
front:指向队首
rear:指向有效数的下一个位置

代码:

//判断是否为空
    public boolean isEmpty(){
        if(rear==front){
            //返回空结果
            return true;
        }
        return false;
    }

(2)判断队列是否满

图解:在这里插入图片描述
当队尾rear+1=front时,环形队列为满
有同学会问:rear+1=0 ?
解释: 在添加操作时,让 rear=(rear+1)%队列.length 不仅可以使尾指针rear尾指针指向头,还可以防止数组越界。
代码:

//判断是否满
    public boolean isFull(){
        if((rear+1)%maxSize==front){
            //返回满结果
            return true;
        }
        return false;
    }

(3)添加操作

在这里插入图片描述
添加操作队首fron不动,队尾rear递增,当rear+1=front时,队列为满。
代码 :

//添加方法
    public void addArray(Object Data){
        //判断是否满
        if(isFull()){
            System.out.println("队列已满,无法添加");
            return;
        }
        array[rear]=Data;
        rear=(rear+1)%maxSize;//限制rear的增长,防止数组越界
    }

(4)取出操作

在这里插入图片描述
取出操作,队尾rear不动,队首front递增,当front==rear时,队列取空。
代码:

//取出方法
    public Object getArray(){
        //判断数组是否为空
        if(isEmpty()){
            System.out.println("数组为空,无法取出");
            return null;
        }
        Object value=array[front];
        front=(front+1)%maxSize;//防止数组越界
        return value;
    }

队列代码

主方法自己写即可

class CircleArray{
    private int maxSize;//队列最大长度
    private Object [] array;//通过数组实现队列
    private int front;//指向环形数组第一位,默认为0
    private int rear;//指向环形数组最后一位,默认为0

    //构造方法
    public CircleArray(int maxSize){
        this.maxSize=maxSize;
        array=new Object[maxSize];
        front=rear=0;//也可以不初始化,默认为0
    }

    //判断是否为空
    public boolean isEmpty(){
        if(rear==front){
            //返回空结果
            return true;
        }
        return false;
    }

    /**
     * @return
     */
    //判断是否满
    public boolean isFull(){
        if((rear+1)%maxSize==front){
            //返回满结果
            return true;
        }
        return false;
    }

    //添加方法
    public void addArray(Object Data){
        //判断是否满
        if(isFull()){
            System.out.println("队列已满,无法添加");
            return;
        }
        array[rear]=Data;
        rear=(rear+1)%maxSize;//限制rear的增长,防止数组越界
    }

    //取出方法
    public Object getArray(){
        //判断数组是否为空
        if(isEmpty()){
            System.out.println("数组为空,无法取出");
            return null;
        }
        Object value=array[front];
        front=(front+1)%maxSize;//防止数组越界
        return value;
    }
    //打印环形数组
    public void showArray(){
        //判断数组是否为空
        if(isEmpty()){
            System.out.println("数组为空,无法打印");
            return;
        }
        //只要队列非空,i=(i+1)%maxSize)仔细品味
        for(int i=front;i!=rear;i=(i+1)%maxSize){
            System.out.print(array[i]+"\t");
        }
        System.out.println();
    }
}

实现原理讲解

在进行实际操作时,maxSize数要比实际大1,因为在进行(rear+1)和 front 比较判断时(rear+1)实际上是一个虚拟空间占一位数组,当虚拟空间指向队列头时证明队列满

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值