队列
队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
数组模拟队列
➢队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。
➢因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front 会随着数据输出而改变,而rear则是随着数据输入而改变,
如图所示:
数组模拟队列
当我们将数据存入队列时称为”addQueue",addQueue 的处理需要有两个步骤:思路分析.
1)将尾指针往后移: rear+1, 当front = rear[空]
2)若尾指针rear小于 队列的最大下标maxSize-1, 则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxSize - 1[队列满]
代码实现数组模拟队列【注 代码没有优化 数组模拟队列不是环形队列 不能重复使用】
import java.util.Scanner;
/**
* 用数组来模拟队列
* @author PeterLiu
*
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
//测试
//创建一个队列
ArrayQueue AQ = new ArrayQueue(3);
Scanner S = new Scanner(System.in);//创建一个扫描器
boolean loop = true;
while(loop) {
System.out.println("s(Show):显示队列");
System.out.println("e(exit):退出队列");
System.out.println("a(add):添加队列");
System.out.println("g(get):取出队列");
System.out.println("h(head):显示队列头");
char key = S.next().charAt(0);//接收一个字符
switch(key) {
case 's':
AQ.show();
break;
case 'a':
System.out.println("请输入一个数:");
int N = S.nextInt();
AQ.addQueue(N);
break;
case 'g':
try {
int res = AQ.getQueue();
System.out.printf("取出数据%d\n",res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
case 'e':
S.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class ArrayQueue{
private int MaxSize;//数组的最大容量
private int front; //队列头
private int rear;//队列尾
private int[]arr;//该数据用于存放队列,用数组模拟队列
public ArrayQueue(int arrMaxsize) {
MaxSize=arrMaxsize;
arr = new int[MaxSize];
front=-1;//指向队列头部,分析出front是指向队列头的前一个位置
rear=-1;//指向队列尾部,指向队列尾的数据(就是指向队列的最后一个数据)
}
//判断队列是否是满的方法
public boolean isFull() {
return rear == MaxSize-1;
}
//判断队列是否为空的方法
public boolean isEmpty() {
return rear == front;
}
//添加数据到队列的方法
public void addQueue(int n) {
//判断队列是否为满
if(isFull()) {
System.out.println("队列满了!!");
return;
}
rear++;//让rear后移
arr[rear]=n;
}
//从队列取出数据的方法
public int getQueue() {
//判断队列是否为空
if(isEmpty()) {
//通过抛异常
throw new RuntimeException("队列为空不能取数据");
}
front++;//front后移
return arr[front];
}
//显示队列的所有数据
public void show() {
//遍历
if(isEmpty()){
System.out.println("数组为空不能遍历");
}
for (int i =0; i < arr.length; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
}