(2) 数组实现队列

队列

  1. 队列是一个有序列表,可以用数组或是链表来实现。
  2. 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
  3. 示意图:(使用数组模拟队列示意图)
    (2) 数组实现队列_第1张图片

数组模拟队列思路

1.队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图:其中 maxSize 是该队列的最大容量。

2.因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示:

3.当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析
1) 将尾指针往后移:rear+1 , 当 front ==rear队列为空
2) 若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。
rear == maxSize - 1[队列满]

存在问题:
无法复用

代码实现

import java.util.Scanner;

public class ArrayQueueDemo {
    //测试
    public static void main(String[] args) {
        ArrayQueue queue=new ArrayQueue(3);
        char key=' '; //接受的用户指令
        Scanner sc=new Scanner(System.in);
        boolean loop=true;
        while(loop) {
            System.out.println("s(show): 显示队列");
            System.out.println("e(exit): 退出程序");
            System.out.println("a(add): 添加数据到队列");
            System.out.println("g(get): 从队列取出数据");
            System.out.println("h(head): 查看队列头的数据");
            key = sc.next().charAt(0);//接收一个字符

            switch (key) {
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.println("输出一个数");
                    int value = sc.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g': //取出数据
                    try {
                        int res = queue.getQueue();
                        System.out.printf("取出的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h': //查看队列头的数据
                    try {
                        int res = queue.peek();
                        System.out.printf("队列头的数据是%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e': //退出
                    sc.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出~~");
    }
    }






    /**
     * 用数组写一个ArrayQueue类
     * 先进先出
     */

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

       //创建队列的构造方法 给定队列大小
       public ArrayQueue(int maxSize){
           this.maxSize=maxSize;
           arr=new int[maxSize];
           front=-1;  //指向队列头部,分析出 front 是指向队列头的前一个位置
           rear=-1;   //指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
       }

       //判断队列是否已满
        public boolean isFull(){
           return rear==maxSize-1; //已经移到数组的最后一个位置,则已满
        }

        //判断队列是否为空
        public boolean isEmpty(){
           return rear==front; //头尾指到一个位置 说明没有数据
        }

        //添加数据到队列
        public void addQueue(int n){
           //先判断队列是否已满
            if(isFull()){
                System.out.println("队列已满,不能加入");
                return;
            }
            rear++; //队尾后移 加数据  第一次为0
            arr[rear]=n;
        }

        //出队列
        public int getQueue(){
           //先判断队列是否为空
           if(isEmpty()){
               throw new RuntimeException("队列为空");//抛出运行时异常 队列为空
           }

           front++;  //先进先出,队头后移
           return arr[front];
        }

        //显示队列所有数据
        public void showQueue(){
           if(isEmpty()){
               System.out.println("队列为空");
               return;
           }
           for(int i=0;i<arr.length;i++){
               System.out.printf("arr[%d]=%d\n",i,arr[i]);
           }
        }

        //显示队列头 ,注意不是取出头
        public int peek(){
            if(isEmpty()){
                throw new RuntimeException("对列为空");
            }
            return arr[front+1];
        }
    }


测试结果:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2022.1\lib\idea_rt.jar=55910:D:\idea\IntelliJ IDEA 2022.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;D:\idea-workspace\20220508\out\production\20220508" ArrayQueueDemo
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据
a
输出一个数
3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据
s
arr[0]=3
arr[1]=0
arr[2]=0
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head): 查看队列头的数据

你可能感兴趣的:(数据结构与算法,java,链表,数据结构)