算法与数据结构-队列

队列

大家好呀,我是小笙,这个系列主要记录我学习算法与数据结构的笔记

先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作

image-20211209211631004

主函数实现调用

public static void main(String[] args) {
        // 按键输入
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入队列的长度:");
        int num = sc.nextInt();
        ArrQueue arr = new ArrQueue(num);
        while(true){
            System.out.println("模拟队列");
            System.out.println("1.添加数据,入栈");
            System.out.println("2.获取数据,出栈");
            System.out.println("3.显示数据");
            System.out.println("4.显示头数据,不出栈");
            System.out.print("请输入你的选择选择(1~4):");
            
            num = sc.nextInt();
            int addNum;
            switch (num){
                case 1: System.out.print("请输入添加的数字数据:");
                        addNum = sc.nextInt();
                        arr.addQueue(addNum);
                        break;
                case 2: System.out.println(arr.getQueueData());
                        break;
                case 3: arr.showArrQueue();
                        break;
                case 4: arr.headQueue();
                        break;
                default:
                    System.out.println("请你重新输入");
            }
        }
    }

创建类 实现队列创建,出栈,入栈等等

image-20211210192201735

class ArrQueue {
    /**
     * 队列
     * 先入先出原则
     * 目前问题:
     * 1)目前的数组使用一次就不能用了,没有达到复用的效果
     * 2)将这个数组使用算法,改进成一个环形的算法 取模%
     */
    private int maxsize; // 表示数组的最大容量
    private int front; // 队列头
    private int rear;  // 队列尾
    private int[] arr; // 该数据用于存放数据,模拟队列

    // 创建队列的构造器
    public ArrQueue(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 num) {
        // 判断队列是否为满
        if (isFull()) {
            System.out.println("队列满,不能加入数据!");
            return;
        }
        rear++;
        arr[rear] = num; // 向数组中插入num这个数
    }

    // 获取队列的数据 出队列
    public int getQueueData() {
        // 判断是否为空队列
        if (isEmpty()) {
            // 通过抛出异常
            throw new RuntimeException("队列为空,无法显示数据!");
        } else {
            front++;
            return arr[front];
        }
    }

    // 显示队列的所有数据
    public void showArrQueue() {
        // 判断是否为空队列
        if (isEmpty()) {
            System.out.println("队列为空,无法显示数据!");
            return;
        }
        for (int i = front; i <= rear-1; i++) {
            System.out.println(arr[i+1] + "\t");
        }
    }

    // 显示头数据不取出
    public void headQueue() {
        // 判断是否为空
        if (isEmpty()) {
            System.out.println("队列为空,无法显示数据!");
            return;
        }
        System.out.println("头数据为" + arr[front + 1]);
    }
}
/*
 * 写到这里,想必大家一定会有疑问,为啥front 和 rear 都是初始值为-1呢?
 * 其实初始值为0也是可以的,只不过代码逻辑会发生微小的变化
 * 原本当初始值为-1的时候,入队列的步骤:1.rear++ 2.向数组中插入num这个数
 * 如果改成初始值为0的时候,入队列的步骤:1.向数组中插入num这个数 2.rear++
 * 但是注意:这个初始化为-1仅局限于非循环队列
 */

为实现复用的效果 将原来的队列升级为循环队列

class Circle {
    private int maxsize; // 表示数组的最大容量
    private int front; // 队列头
    private int rear;  // 队列尾
    private int[] arr; // 该数据用于存放数据,模拟队列

    // 创建队列的构造器
    public Circle(int arrMaxSize) {
        maxsize = arrMaxSize;
        arr = new int[maxsize];
        front = 0;  // front就指向队列的第一个元素
        rear =  0;  // rear指向队列最后一个元素的后一个位置
    }

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

    // 判断队列是否为空
    public boolean isEmpty() {
        return rear == front;
    }

    // 添加数据到队列 入栈
    public void addQueue(int num) {
        // 判断队列是否为满
        if (isFull()) {
            System.out.println("队列满,不能加入数据!");
            return;
        }
        arr[rear] = num; // 向数组中插入num这个数
        rear = (rear+1)%maxsize;
    }

    // 获取队列的数据 出栈
    public int getQueueData() {
        // 判断是否为空队列
        if (isEmpty()) {
            // 通过抛出异常
            throw new RuntimeException("队列为空,无法显示数据!");
        } else {
            int value =arr[front];
            front = (front+1)% maxsize;
            return value;
        }
    }

    // 显示队列的所有数据
    public void showArrQueue() {
        // 判断是否为空队列
        if (isEmpty()) {
            System.out.println("队列为空,无法显示数据!");
            return;
        }
        // 思路:从front开始,遍历多少个元素
        for (int i = front; i < front+(rear+maxsize-front)% maxsize; i++) {
            System.out.println(arr[i%maxsize] + "\t");
        }
    }

    // 显示头数据不取出
    public void headQueue() {
        // 判断是否为空
        if (isEmpty()) {
            System.out.println("队列为空,无法显示数据!");
            return;
        }
        System.out.println("头数据为" + arr[front]);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al_tair

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值