介绍:
1.队列是一个有序列表,可以用数组或者链表来实现
2.遵循先进先出的原则即:现存入数据,要先取出,后存入的数据后取出
3.示意图
图 1-1
数组模拟队列:
1.队列本身是有序列表,若使用数组的结构来表示,存储队列,则队列数组的生明如上图,其中Maxsize是该队列的最大容量
2.因为队列的输出,输入是分别从前后端来处理,因此需要两个变量front,rear分别标记录队列前后端的下标,front 会随着数据的改变而改变而rear则是随着数据输入而改变
3.当我们数据存入队列时称为"addQueue",addQueue的处理分为两步
4.思路分析:
1)将尾针往后移:rear+1 当font==rear 则队列为[空]
2)若指针rear小于队列的最大下标 maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据, 若rear==maxSize-1 则 队列已满
代码实现
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
ArrayQueue arrayQueue=new ArrayQueue(3);
char key;
Scanner scanner=new Scanner(System.in);
boolean loop=true;
while (true){
System.out.printf("s(show):显示队列");
System.out.printf("e(exit):推出");
System.out.printf("a(add):添加队列");
System.out.printf("g(get):从队列取出数据");
System.out.printf("h(head):查看队列头");
key=scanner.next().charAt(0);
switch (key){
case 's':
arrayQueue.showQueue();
break;
case'a':
System.out.println("输入一个数字");
int value=scanner.nextInt();
arrayQueue.addArrayQueue(value);
break;
case 'g':
try {
int res=arrayQueue.getQueue();
System.out.printf("取出的数据%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int res=arrayQueue.getHeadQueue();
System.out.printf("取出的数据%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop=false;
System.out.println("程序退出");
break;
default:
break;
}
}
}
}
class ArrayQueue{
private int maxSize;//最大数
private int font;//头指针
private int rear;//尾指针
private int arr[];//队列数组
public ArrayQueue(int arrMaxSize) {
maxSize=arrMaxSize;
font=-1;
rear=-1;
arr=new int[maxSize];
}
public void addArrayQueue(int n){
if(isFull()){
System.out.println("数组已满");
return;
}else {
rear++;
arr[rear]=n;
}
}
public boolean isFull(){
return rear==maxSize-1;
}
public boolean isEmpty(){
return rear==font;
}
//出队列
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
font++;
return arr[font];
}
public void showQueue(){
if(isEmpty()){
System.out.println("队列为空");
}
else{
for (int i = 0; i < arr.length; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
}
public int getHeadQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[font+1];
}
}
问题分析并优化
1.目前数组使用一次就不能用,没有达到复用的效果;
2.将这个数组使用的算法,改成一个环形的队列 ---->取模%