> 文档中心 > 数组实现队列 详细讲解(java)

数组实现队列 详细讲解(java)


数组实现队列 详细讲解

队列的介绍

数组实现队列 详细讲解(java)
在这里插入图片描述

队列的一个使用场景

银行排队的案例
在这里插入图片描述

数组模拟队列的思路:

在这里插入图片描述

1、定义一个数组 arr[maxSize] 作为该队列
2、rear定义为队尾指针
3、front定义为对头指针
4、入队addQueue,将队尾指针往后移,rear+1的情况下,要判断队列的元素是否已满,已满的条件为rear=maxSize-1;
5、出队outQueue,将队头的元素往后移,front+1的情况下,要判断队列的元素是否为空,为空的条件为rear=front;

代码实现

package com.qf;import java.util.Scanner;public class ArrayQueue {    private int maxSize;    private int front;    private int rear;    private int[] arr;    /**     * 队列的实现     */    //初始化队列    public ArrayQueue(int maxSize){ this.arr=new int[maxSize]; this.maxSize=maxSize; this.front=-1; this.rear=-1;    }    //判断队列是否为空    public boolean isEmpty(){ return front==rear;    }    //判断队列是否已满    public boolean isFull(){ return rear==maxSize-1;    }    //添加数据到队列,入队    public void addQueue(int n){ //判断队列是否已满 boolean full = isFull(); if (full){     System.out.println("队列已满,请稍后~~~"); }else{     arr[rear+1]=n;     rear++; }    }    //数据从队列中出来,出队    public int  outQueue(){ //判断队列是否为空 boolean empty = isEmpty(); if (empty){     throw new RuntimeException("队列为空,无法取出数据~~~"); }else {     front++;     System.out.println("出队的数据为:"+arr[front]);     arr[front]=0;     return arr[front]; }    }    //队列的展示,遍历数组    public void showQueue(){ //判断队列是否为空 boolean empty = isEmpty(); if (empty){     throw new RuntimeException("队列为空,无法取出数据~~~"); }else{     for (int i : arr) {  System.out.printf(" "+i);     } }    }    //展示队头数据    public void showHeader(){ System.out.println("队头数据为:"+arr[front+1]);    }    public static void main(String[] args) { ArrayQueue arrayQueue = new ArrayQueue(4); boolean loop=true; char sc=' '; while (loop){     System.out.println("e 跳出循环");     System.out.println("a 入队");     System.out.println("o 出队");     System.out.println("s 循环队列");     System.out.println("h 展示队头");     Scanner systemPut=new Scanner(System.in);     sc=systemPut.next().charAt(0);     switch (sc){  case 'a':      System.out.println("请输入数据:");      Scanner addNum=new Scanner(System.in);      int num = addNum.nextInt();      arrayQueue.addQueue(num);      break;  case 'o':      arrayQueue.outQueue();      break;  case 's':      arrayQueue.showQueue();      break;  case 'h':      arrayQueue.showHeader();      break;  case 'e':      loop=false;      break;  default :      break;     } }    }}

问题以及需要优化的点

1、目前的数组只能使用一次,不能达到复用的效果
2、将该数组使用算法,改成环形数组,取模%

环形数组详见,我的下一篇博客

https://blog.csdn.net/cativen/article/details/124366550