java语言实现常用数据结构: 环形队列


前言

本文将用java语言实现常用数据结构之一: 环形队列

一、环形队列是什么?

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481?fr=aladdin

二、具体实现

1.思路分析

  • front含义做出调整 指向第一个元素 而不是前面 front=0
  • rear 也调整 指向最后元素的后一个位置,空出一个位置作为约定 rear=0
  • 当队列满时, 原来的条件是 rear==maxSize -1 现在改为 (rear+1)%maxSize=front(满)
  • 因为要预留一个空间 所以rear +1 如果front 一直是零的话 就是整除 取出一个前移一位 放进一个后移一位0,10–1,1 而maxSize一直是10
  • 为空的条件是rear==front
  • 队列有效数据的个数是 (rear +maxSize-front)%maxSize
 private int maxSize;
    private int front;//队列头
    private int rear; //队列尾
    private int[] arr;//存放数据 ,模拟队列
  
    

构造方法 确定初始值
front=0;//指向队列的头部前一个位置
rear=0;//指向队列尾部的具体位置,就是队列最后一个数据的位置
这两个初始值关系到怎么确定当前数据的位置,要注意

  public circleQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr=new int[maxSize];//空出一个位置
        front=0;//指向队列的头部前一个位置
        rear=0;//指向队列尾部的具体位置,就是队列最后一个数据的位置
    }

2.获取、添加、删除、遍历队列方法的实现

辅助方法 为满条件发生了变化 因为预留了一个空间 front 在变化 但是一定容量的时候 rear与front 的距离是不变的 当(rear+1)%maxSize==front就满了

   //判断队列是否满
    public boolean isFull(){
        return (rear+1)%maxSize==front;
    }
    public boolean isEmpty(){
        return rear==front;
    }

添加:首先判断是否满了 如果是 则直接返回
如果还没满 让头(rear)后移( rear=(rear+1)%maxSize;) 并赋值;

 public void addQueue(int n){
        if (isFull()){
            System.out.println("已经满了");
            return;
        }
        //rear后移 因为先进先出 头部分先被取到 添加从尾部开始添加
         arr[rear]=i;
        //先后移 必须考虑取模 ,即不能越界 如果大了 就把rear 放在前面取模
    /**
     * rear最大时  (rear+1)%maxSize 会等于front 9+1/10 rear 的位置不可能超过maxSize
     * 因为会循环,不可能越界
     */
        rear=(rear+1)%maxSize;
    }

出列

 //获取队列
    public  int getQueue(){

        if (isEmpty()){
            throw new RuntimeException("队列空,不能获取数据");
        }
        //front前移 因为先进先出 头部分先被取到
      //  front++;
    //    return arr[front];
         int value=arr[front];
        front=(front +1)%maxSize;
        return value;
    }

显示队列头部,不是出列 不删除数据

   /**
     * 显示队列的头部 不是取数据
     */
    public  int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空,不能获取数据");

        }
        return arr[front+1];
    }

遍历队列 使用fo循环

    public void showQueue(){
        if (isEmpty()){
            System.out.println("没有数据");
            return;
        }
          for (int i=front;i<front+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
    }

求出当前队列有效数据 的个数

 //求出当前队列有效数据 的个数
 public  int size(){
     //rear
    return  (rear +maxSize-front)%maxSize;
 }


总结+技巧+语法

小算法: //求出当前队列有效数据 的个数
a= (rear +maxSize-front)%maxSize;
环形后移 front=(front +1)%maxSize;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值