用数组模拟队列
队列:
1,队列是一种先进先出的线性表,它只允许在表的一段进行插入,而在另一端删除元素,在队列中,允许插入的一段叫做队尾(rear),允许删除的一端则称为队头。
2,举例:①银行叫号排队
②操作系统中的作业排队:在允许多道程序运行的操作系统中,同时有几个作业运行,如果运行的结果都需要用通道输出,那就要按请求输出的先后次序排队。每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中推出作输出操作。凡是申请输出的作业都从队尾进入队列
3,数组模拟队列示意图:
4,数组模拟队列思路:
首先,如上图所示:
- MaxSize是该队列的最大容量
- 因为队列的输入输出分别从两端进行,因此用两个变量front和rear分别记录两端的下标,front会随着数据输出而改变,rear会随着数据输入而改变
- 当我们将数据存入队列时,rear+1,如果rear==front,则说明队列为空;如果rear==MaxSize-1,则说明队列已满
5,代码实现
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]; } }
运行结果: