队列介绍
1:队列是一个有序列表,可以用数组或是链表来实现。
2:遵循先入先出的原则,既:先存入队列的数据,要先取出,后存入的要后取出。
3:示意图:使用数组模拟队列示意图:
数组模拟队列:
1:队列本身就是有序列表,如果使用数组的结构来储存队列的数据,则队列数组的声明如下图,其中maxsize是该队列的最大容量。
2:因为队列的输出,输入是分别从前向后来处理的,因此需要定义两个变量front和rear分别纪录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据的输入而改变。
3:当我们将数据存入队列称为"AddQueue","AddQueue"的处理需要有两个步骤:思想分析
1、将尾指针往后移:rear++,并且front==rear (空)
2,若尾指针rear小于队列的最大下标maxSize-1,则将数据存入到指定数组元素中,否则无法存入。rear==front-1(队列满)
代码如下:
package com.javasf;
import java.util.Scanner;
public class queue {
public static void main(String[] args) {
// 测试
// 初始化队列
Queuetest que = new Queuetest(3);
// 用户输入选择菜单
char key = ' ';
Scanner sc = new Scanner(System.in);
boolean loop=true;
while (loop){
System.out.println("请选择q:显示队列");
System.out.println("请选择w:退出程序");
System.out.println("请选择e:添加数据到队列");
System.out.println("请选择r:从队列取数据");
System.out.println("请选择t:查看队列头");
key = sc.next().charAt(0);
switch (key){
case 'q':
que.showQueue();
break;
case 'w':
loop=false;
break;
case 'e':
System.out.println("请输入一个数");
int a =sc.nextInt();
que.AddQueue(a);
break;
case 'r':
try {
int res = que.getQueue();
System.out.println("取出的数据为"+res);
}catch (Exception e){
System.out.println(e);
}
break;
case 't':
try {
int head = que.headQueue();
System.out.println("队列头"+head);
}catch (Exception e){
System.out.println(e);
}
break;
default:
System.out.println("请输入正确的指令");
break;
}
}
}
}
class Queuetest {
int maxSize;//最大容量
int front;//队列头
int rear; //队列脚
int[] arr;
//定义一个构造方法
public Queuetest(int maxSize) {
this.maxSize = maxSize;
this.front = -1;
this.rear = -1;
arr= new int[maxSize];
}
//定义一个方法来判断是否满了
public boolean fofull() {
return rear == maxSize - 1;
}
//定义一个方法来判断是否为空了
public boolean foempty() {
return front == rear;
}
//定义一个方法来添加数据
public void AddQueue(int a) {
if (fofull()) {
System.out.println("队列已满");
return;
}
rear++;
arr[rear] = a;
}
//定义一个方法来获取数据出队列
public int getQueue() {
if (foempty()) {
throw new RuntimeException("队列为空");
}
front++;
return arr[front];
}
//显示队列的所有数据
public void showQueue() {
if (foempty()) {
System.out.println("队列为空");
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]=" + arr[i]);
}
}
//显示头部数据
public int headQueue() {
if (foempty()) {
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
}
运行效果:
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
e
请输入一个数
2
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
e
请输入一个数
3
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
e
请输入一个数
5
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
r
取出的数据为2
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
r
取出的数据为3
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
r
取出的数据为5
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
r
java.lang.RuntimeException: 队列为空
请选择q:显示队列
请选择w:退出程序
请选择e:添加数据到队列
请选择r:从队列取数据
请选择t:查看队列头
w
问题分析并优化
1:目前队列使用一次就不能用了,没有达到预期的效果。
2:后期将这个数组使用算法,改进成一个环形的队列 取模:%。