队列:java
1,队列是一种先进先出的线性表,它只容许在表的一段进行插入,而在另外一端删除元素,在队列中,容许插入的一段叫作队尾(rear),容许删除的一端则称为队头。数组
2,举例:
①银行叫号排队
②操做系统中的做业排队:在容许多道程序运行的操做系统中,同时有几个做业运行,若是运行的结果都须要用通道输出,那就要按请求输出的前后次序排队。每当通道传输完毕能够接受新的输出任务时,队头的做业先从队列中推出做输出操做。凡是申请输出的做业都从队尾进入队列ide
3,数组模拟队列示意图:
4,数组模拟队列思路:oop
首先,如上图所示:操作系统
MaxSize是该队列的最大容量
由于队列的输入输出分别从两端进行,所以用两个变量front和rear分别记录两端的下标,front会随着数据输出而改变,rear会随着数据输入而改变
当咱们将数据存入队列时,rear+1,若是rear==front,则说明队列为空;若是rear==MaxSize-1,则说明队列已满
5,代码实现code
package com.boogie.QueueArr; import java.util.Scanner; public class QueueArr { public static void main(String[] args) { ArrQueue queue=new ArrQueue(3); char key=' '; Scanner scan=new Scanner(System.in); boolean loop=true; while(loop) { System.out.println("s(show):显示队列"); System.out.println("a(add):添加数据到队列"); System.out.println("g(get):从队列取出数据"); System.out.println("h(head):查看队列头的数据"); System.out.println("e(exit):退出程序"); key=scan.next().charAt(0); switch(key) { case's': queue.showQueue(); break; case'a': System.out.println("请输入一个数字:"); int value=scan.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.headQueue(); System.out.printf("队列头的数据是:%d\n",res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case'e': scan.close(); loop=false; break; default: break; } } System.out.println("程序退出~~"); } } //使用数组模拟队列——编写一个QueueArr类 class ArrQueue{ 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 QueueisFull(){ return rear==Maxsize-1; } //判断队列是否空 public boolean QueueisEmpty() { return rear==front; } //添加数据到队列 public void addQueue(int n) { if(QueueisFull()) { System.out.println("队列已满,没法加入数据"); return; } rear++;//rear后移 Arr[rear]=n; } //获取队列数据,出队列 public int getQueue(){ if(QueueisEmpty()) { throw new RuntimeException("队列为空,没有数据"); } front++; return Arr[front]; } //显示队列的全部数据 public void showQueue(){ if(QueueisEmpty()) { System.out.println("队列为空,没有数据"); return; }for(int i=0;i<Arr.length;i++) { System.out.printf("Arr[%d]=%d\n",i,Arr[i]); } } //显示队列的头数据 public int headQueue() { if(QueueisEmpty()) { System.out.println("队列为空,没有数据"); }return Arr[front+1]; } }