数据结构-队列(Queue)-java

一、介绍

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循先入先出的原则。
    即:先存入队列的数据,要先取出。后存入的要后取出

二、数组模拟队列

  • 示意图:(使用数组模拟队列示意图)
    队列示意图

数组模拟队列介绍:

  • (1)MaxSize:队列最大数量
  • (2)front:队列头指针 初始化为 -1
  • (3)rear:队列尾指针 初始化为 -1

指针间的关系:

  • (1) front==rear: 队列为空
  • (2) rear==MaxSize-1: 队列为满
  • (3) rear++:数据入列
  • (4) front++:数据出列
  • (5) front+1:队列头部

三、代码实现

//数组模拟队列
class ArrayQueue {
    private int maxSize; //队列长度
    private int rear;//队列尾部
    private int fount;//队列头
    private int[] arr;//存放数据

    ArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        rear = -1;
        fount = -1;
    }
    //判断是否已满
    public boolean isFull(){
        //当尾部和队列长度-1相等时
        return  rear==maxSize-1;
    }
    //判断是否为空
    public boolean isEmpty(){
        //当尾部和和头部记录想等时
        return  rear==fount;
    }

    //添加数据
    public void add(int a ){
        if (isFull()) {
            System.out.println("队列已经满了");
            return;
        }
        rear++;
        arr[rear] = a;
    }
    //获取队列数据
    public int getQueue(){
        if (isEmpty()){
          throw new RuntimeException("队列为空");
        }
        fount++;
        return arr[fount];
    }
    //获取队列所有数据
    public  void showQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
            return;
        }
        for (int a = fount+1; a<=rear;a++){
            System.out.println(arr[a]);
        }
    }
    public void showHead(){
        if (isEmpty()){
            System.out.println("队列为空");
            return;
        }
        System.out.println(arr[fount+1]);
    }

}

四、环形队列

通过上述代码我们可以看到数组模拟队列的增删,但是这样只是一次性的,怎么样才能充分的利用空间呢?

  • 环形队列
    同样我们用数组进行一个模拟环形队列,将数组看做是一个环形的(通过取模的方式来实现即可)

队列示意图
同样的图形我们对它的重新定义一下
数组模拟环形队列介绍:

  • (1)MaxSize:队列最大数量
  • (2)front:队列头指针 初始化为 0 指向队列第一个元素
  • (3)rear:队列尾指针 初始化为 0 指向队列最后一个元素的后一个位置(需要空出一个空间作为约定)

指针间的关系:

  • (1) front==rear: 队列为空
  • (2) (rear + 1) % maxSize == front : 队列为满
  • (3) (rear+1)%maxSize:数据入列
  • (4) (fount+1)%maxSize;:数据出列

代码示例:

class CircleArrayQueue{
   private int maxSize; //队列长度
   private int rear;//队列尾部
   private int fount;//队列头
   private int[] arr;//存放数据

   CircleArrayQueue(int arrmaxSize){
       this.maxSize = arrmaxSize+1;
       arr = new int[maxSize];
   }

   //判断是否已满
   public boolean isFull(){
       return  (rear+1)%maxSize==fount;
   }
   //判断是否为空
   public boolean isEmpty(){
       //当尾部和和头部记录想等时
       return  rear==fount;
   }

   //添加数据
   public void add(int   a ){
       if (isFull()) {
           System.out.println("队列已经满了");
           return;
       }
       arr[rear] = a;
       rear=(rear+1)%maxSize;
   }

   //获取队列数据
   public int getQueue(){
       if (isEmpty()){
           throw new RuntimeException("队列为空");
       }
       int value = arr[fount];
       fount=(fount+1)%maxSize;
       return value;
   }

   //获取队列所有数据
   public  void showQueue(){
       if (isEmpty()){
           System.out.println("队列为空");
           return;
       }
       for (int a = fount; a<fount+Size();a++){
           System.out.println("arr["+a%maxSize+"] = "+arr[a%maxSize]);
       }
   }

   public  int  Size(){
       return (rear+maxSize-fount)%maxSize;
   }
   public void showHead(){
       if (isEmpty()){
           System.out.println("队列为空");
           return;
       }
       System.out.println(arr[fount]);
   }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值