算法与数据结构-队列

Posted Al_tair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法与数据结构-队列相关的知识,希望对你有一定的参考价值。

队列

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

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

主函数实现调用

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("请你重新输入");
            
        
    

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

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]);
    

以上是关于算法与数据结构-队列的主要内容,如果未能解决你的问题,请参考以下文章

图解数据结构与算法一文带你玩转栈和队列

图解数据结构与算法一文带你玩转栈和队列

从0开始学算法--数据结构(2.3队列)

Java数据结构及算法实战系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue

Java数据结构及算法实战系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue

Java数据结构及算法实战系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue