队列:
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];
}
}