Java数据结构--队列

队列:是一个有序列表,可以用数组或者链表实现,遵循先入先出(first in first out)FIFO原则。

用数组实现如下:

public class ArrayQueue {
    private int maxSize;//数组的最大容量
    private int front;//队列头的前一个位置
    private int rear;//队列尾
    private int[] arr;

    //构造队列
    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr=new int[maxSize];
        front=-1;//队列头的前一个位置
        rear=-1;
    }

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

    //判断队列是否空
    public boolean isEmpty(){
        return rear==front;
    }
    //添加数据到队列
    public void addQueue(int value){
        if(isFull()){
            System.out.println("队列满!");
            return;
        }
        rear++;
        arr[rear]=value;
    }

    //数据出队列
    public int getQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据!");
        }
        front++;
        return arr[front];
    }

    //遍历数据并显示
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列空,没有数据显示!");
            return;
        }
        for (int i = front+1; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    //显示队列的头数据
    public int showHead(){
        if(isEmpty()){
            throw new RuntimeException("没有数据,头为空!");
        }
        return arr[front+1];
    }
}

测试类

public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(4);

        queue.addQueue(2);
        queue.addQueue(4);
        queue.addQueue(5);
        queue.addQueue(6);
        //queue.addQueue(4);

       queue.showQueue();//2,4,5,6

        System.out.println("----------------");
      int res = queue.getQueue();
       System.out.println(res);//2

        System.out.println("----------------");


        int res2 = queue.showHead();
        System.out.println(res2);

        System.out.println("----------------");


        queue.addQueue(8);
        queue.showQueue();//4,5,6
    }
}

在这里插入图片描述
从结果可以看出,这种方法有bug,插入了2,4,5,6四个数据,然后出队列,队列只剩下4,5,6三个数据,但是再添加一个8,却显示队列满!这是因为虽然2出了队列,它在数组中的内存却没有释放,只是用front指针模拟了队列而已。因此,可以用环形数组来解决这个问题。

用数组模拟环形队列:

public class CircleQueue {
    private int maxSize;//数组的最大容量
    private int front;//队列头
    private int rear;//队列尾的后一个位置
    private int[] arr;

    //构造队列
    public CircleQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        arr=new int[maxSize];
    }

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

    //判断队列是否空
    public boolean isEmpty(){
        return rear==front;
    }
    //添加数据到队列
    public void addQueue(int value){
        if(isFull()){
            System.out.println("队列满!");
            return;
        }
        arr[rear]=value;
        rear=(rear+1)%maxSize;
    }

    //数据出队列
    public int getQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列为空,没有数据!");
        }
        int value=arr[front];
        front=(front+1)%maxSize;
        return value;

    }

    //遍历队列数据并显示
    public void showQueue(){
        if(isEmpty()){
            System.out.println("队列空,没有数据显示!");
            return;
        }
        for (int i = front; i < front+size(); i++) {
            System.out.println(arr[i%maxSize]);
        }
    }

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


    //显示队列的头数据
    public int showHead(){
        if(isEmpty()){
            throw new RuntimeException("没有数据,头为空!");
        }
        return arr[front];
    }
}

测试类

public class CircleQueueDemo {
    public static void main(String[] args) {
        CircleQueue queue = new CircleQueue(4);

        queue.addQueue(2);
        queue.addQueue(4);
        queue.addQueue(5);

        queue.showQueue();//2,4,5

        System.out.println("----------------");

        int res = queue.getQueue();
        System.out.println(res);//2
        System.out.println("----------------");


        int res2 = queue.showHead();
        System.out.println(res2);

        System.out.println("----------------");


        queue.addQueue(8);
        queue.showQueue();//4,5,8
    }
}

在这里插入图片描述
最大容量为4,实际只能存3个数据,预留一个空间,用来判断是否满!当然,也有不预留空间的办法。此外,还有用链表实现的方法。最重要的是思想!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值