数据结构:队列的java实现以及优化

队列

队列是一种先进先出,后进后出的数据结构。
如果用数组的基本数据结构实现的话,普通的队列只能入列的元素数量为数组的大小,不管是否已经出列。

/**
 * 队列:先入先出,后入后出
 * 最多只能入列maxSize个元素,不管是否已经出列
 */
public class Queue {

    private int maxSize; // 队列的最大容量
    private int first = -1; // 第一个成员的index
    private int last = 0; // 最后一个成员的index +1
    private String[] arr;

    public Queue(int maxSize){
        this.maxSize = maxSize;
        arr = new String[maxSize];
    }

    public String take(){
        if (first+1 == last){
            System.out.println("队列为空,无法出列");
            return null;
        }

        first ++;
        String e = arr[first];
        return e;
    }

    public void add(String e){
        if (last == maxSize){
            System.out.println("队列已满,无法添加");
            return;
        }

        arr[last] = e;
        last ++;
    }
}

环形队列

基于上面说到的普通队列的缺点,我们可以进行优化——环形队列,让队列可以同时存在数组大小的元素数量,不管之前是否已经出列。

/**
 * 环形队列:在队列可以同时存在maxSize个元素,不管之前已经出列了多少元素
 */
public class CycleQueue {

    private int maxSize; // 队列的最大容量
    private int first = -1; // 第一个成员的index
    private int last = 0; // 最后一个成员的index +1
    private String[] arr;

    public CycleQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new String[maxSize];
    }

    public void add(String e){
        if (last-first == maxSize+1){
            System.out.println("队列已满,无法添加");
            return;
        }

        arr[last%maxSize] = e;
        last ++;
    }

    public String take(){
        if (first == last-1){
            System.out.println("队列为空,无法出列");
            return null;
        }

        first ++;
        String e = arr[first%maxSize];
        return e;

    }
}

测试

在这里插入图片描述
测试代码如下:

public class Test {
    public static void main(String[] args) {
        System.out.println("====普通队列测试");
        queueTest();
        System.out.println("====环形队列测试");
        cycleQueueTest();
    }

    public static void queueTest(){
        Queue queue = new Queue(10);

        queue.add("a");
        queue.add("b");
        queue.add("c");
        System.out.println(queue.take());
        System.out.println(queue.take());
        queue.add("d");
        System.out.println(queue.take());
        System.out.println(queue.take());
    }

    public static void cycleQueueTest(){
        CycleQueue cycleQueue = new CycleQueue(2);
        cycleQueue.add("a");
        cycleQueue.add("b");
        System.out.println(cycleQueue.take());
        System.out.println(cycleQueue.take());
        cycleQueue.add("c");
        cycleQueue.add("d");
        cycleQueue.add("e");
        System.out.println(cycleQueue.take());
        System.out.println(cycleQueue.take());
    }
}

完整代码的已上传至GitHub

欢迎关注同名公众号:“我就算饿死也不做程序员”。
交个朋友,一起交流,一起学习,一起进步。在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值