用数组模拟实现队列

认识队列

在这里插入图片描述
在这里插入图片描述

数组模拟队列的步骤思路

在这里插入图片描述

在这里插入图片描述

涉及的方法

  • isFull() 判断队列是否满
  • isEmpty() 判断队列是否为空
  • addQueue() 添加数据到队列
  • getQueue() 获取队列数据出队列
  • ShowQueue() 显示队列所有数据
  • ShowHeadQueue() 显示队列头部是数据

代码实现

package 数组实现队列;

import java.util.Scanner;

/**
 * @author 你是大**吗?
 * version 1.0
 */
@SuppressWarnings({
    
    "all"})
public class ArrayQueueDemo {
    
    
    public static void main(String[] args) {
    
    
        //测试
        ArrayQueue arrayQueue = new ArrayQueue(3);

        char key = ' ';//用户键盘输入的要求
        Scanner scanner = new Scanner(System.in);


        boolean loop = true;
        //输出一个菜单
        while (loop) {
    
    
            System.out.println("s--显示队列");
            System.out.println("e--退出程序");
            System.out.println("a--添加数据");
            System.out.println("g--从队列获取数据");
            System.out.println("h--获取队列头");
            key = scanner.next().charAt(0);
            switch (key) {
    
    
                case 'a':
                    System.out.print("请输入要添加的数据:");
                    int n = scanner.nextInt();
                    arrayQueue.addQueue(n);
                    break;
                case 's':
                    arrayQueue.ShowQueue();
                    break;
                case 'g':
                    int queue = arrayQueue.getQueue();
                    System.out.println("获取到的队列数据是:"+queue);
                    break;
                case 'h':
                    int headQueue = arrayQueue.ShowHeadQueue();
                    System.out.println("队列头是:"+headQueue);
                    break;
                case 'e':

                    loop=false;
                    break;
                default:break;
            }
        }
        System.out.println("程序退出...");
    }
}

class ArrayQueue {
    
    
    //队列的最大容量
    private int maxSize;
    private int front;//队列头
    private int rear;//队列尾
    private int arr[]; //模拟队列 用来存放数据

    //构造器 创造对象的同时来自定数组大小
    public ArrayQueue(int maxSize) {
    
    
        this.maxSize = maxSize;
        this.front = -1;
        this.rear = -1;
        arr = new int[maxSize];
    }

    //isFull() 判断队列是否满
    public boolean isFull() {
    
    
        //队列尾等于数组最大值满
        return rear == maxSize - 1;
    }

    //isEmpty() 判断队列是否为空
    public boolean isEmpty() {
    
    
        //两个值相等代表队列空了
        return front == rear;
    }

    // addQueue() 添加数据到队列
    public void addQueue(int n) {
    
    
        //先判断队列是否为满
        if (isFull()) {
    
    
            System.out.println("队列满了");
            return;
        }

        //初始rear=-1 所以要++rear在添加到数组  当前rear就指向了第一次添加的数据
        arr[++rear] = n;
    }

    //getQueue() 获取队列数据,出队列
    public int getQueue() {
    
    
        //判断队列是否为空
        if (isEmpty()) {
    
    
            throw new RuntimeException("队列为空,不能获取数据");
        }
        //先进的先出
        return arr[++front];
    }

    //ShowQueue() 显示队列所有数据
    public void ShowQueue() {
    
    
        if (isEmpty()) {
    
    
            System.out.println("队列是空的...");
            return;
        }
        //不等在i=0开始 因为可能有出队列操作
        for (int i = front + 1; i < arr.length; i++) {
    
    
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }
    }

    //ShowHeadQueue() 返回队列头部是数据 不是拿出来
    public int ShowHeadQueue() {
    
    
        if (isEmpty()) {
    
    
            throw new RuntimeException("队列是空的...");
        }
        return arr[front + 1];
    }

}

出现一个问题

在这里插入图片描述

数组模拟环形队列

对前面的数组实现队列进行优化,把数组看为环形的,通过取模来实现 思路分析:

在这里插入图片描述

在这里插入图片描述

代码实现

package 数组实现队列;

import java.util.Scanner;

/**
 * @author 你是大**吗?
 * version 1.0
 */
@SuppressWarnings({
    
    "all"})
public class CircleQueueDemo {
    
    
    public static void main(String[] args) {
    
    
//测试
        CircleQueue arrayQueue = new CircleQueue(4);

        char key = ' ';//用户键盘输入的要求
        Scanner scanner = new Scanner(System.in);


        boolean loop = true;
        //输出一个菜单
        while (loop) {
    
    
            System.out.println("s--显示队列");
            System.out.println("e--退出程序");
            System.out.println("a--添加数据");
            System.out.println("g--从队列获取数据");
            System.out.println("h--获取队列头");
            key = scanner.next().charAt(0);
            switch (key) {
    
    
                case 'a':
                    System.out.print("请输入要添加的数据:");
                    int n = scanner.nextInt();
                    arrayQueue.addQueue(n);
                    break;
                case 's':
                    arrayQueue.ShowQueue();
                    break;
                case 'g':
                    int queue = arrayQueue.getQueue();
                    System.out.println("获取到的队列数据是:"+queue);
                    break;
                case 'h':
                    int headQueue = arrayQueue.ShowHeadQueue();
                    System.out.println("队列头是:"+headQueue);
                    break;
                case 'e':

                    loop=false;
                    break;
                default:break;
            }
        }
        System.out.println("程序退出...");
    }
}


class CircleQueue {
    
    
    //大小
    private int maxSize;
    //front指向第0个元素,也就是队列的第一个元素
    private int front = 0;
    //rear指向最后一个元素的后面一个元素,留出一个空闲的位置,以便制作成环形队列

    private int rear = 0;
    private int arr[];

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

    //isFull() 判断队列是否满
    public boolean isFull() {
    
    
        //小算法 把数组看成环形的要是rear+1 在front前面(紧挨着) 就满了
        return (rear + 1) % maxSize == front;
    }

    //isEmpty() 判断队列是否为空
    public boolean isEmpty() {
    
    
        //两个值相等代表队列空了
        return front == rear;
    }

    // addQueue() 添加数据到队列
    public void addQueue(int n) {
    
    
        //先判断队列是否为满
        if (isFull()) {
    
    
            System.out.println("队列满了");
            return;
        }
        //rear指向最后数据的下一个位置
        arr[rear] = n;
        //rear++;这样是错误的
        //比如是0的话  (0+1)%4=1 rear=1 yes
        rear = (rear + 1) % maxSize;
    }

    //getQueue() 获取队列数据,出队列
    public int getQueue() {
    
    
        //判断队列是否为空
        if (isEmpty()) {
    
    
            throw new RuntimeException("队列为空,不能获取数据");
        }
        //front就是指向数组中的数据 不是指向数据的前一个位置
        //先取出来
        int res=arr[front];
        //改变front
        //比如是0的话  (0+1)%4=1 rear=1 yes
        front=(front+1)%maxSize;
        return res;
    }

    //ShowQueue() 显示队列所有数据
    public void ShowQueue() {
    
    
        if (isEmpty()) {
    
    
            System.out.println("队列是空的...");
            return;
        }
       //环形队列这就该考虑 如何打印了
        for (int i = front; i < front+size(); i++) {
    
    
            // i=0  循环3次 打印0 1 2下标数
            System.out.printf("arr[%d]=%d\n", i%maxSize, arr[i%maxSize]);
        }
    }
    //计算出存放有效数据的数组元素有多少个

    public int size(){
    
    
        //小算法 rear=3 front=0 maxSize=4
        // (3+4-0)%4=3  rear等于三数组正好存放三个元素
    return (rear+maxSize-front)%maxSize;
    }
    //ShowHeadQueue() 返回队列头部是数据 不是拿出来
    public int ShowHeadQueue() {
    
    
        if (isEmpty()) {
    
    
            throw new RuntimeException("队列是空的...");
        }
        return arr[front ];
    }

}

猜你喜欢

转载自blog.csdn.net/m0_56398287/article/details/127022404