1.介绍
·队列是一个有序列表,可以用
数组
或是
链表
来实现。
·
遵循
先入先出
的原则。即:先存入队列的数据,要先取出。后存入的要后取出
·
示意图:
(
使用数组模拟队列示意图
)
2.思路
(1). front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素, front 的初始值 = 0
(2). . rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定. rear 的初始值 = 0,rear指向的位置不放数据。也就是说,长度位n的数组,只能放(n-1)个有效数字
(3). 当队列满时,条件是 (rear + 1) % maxSize == front 【满】,rear指向的位置
(4). 对队列为空的条件, rear == front 空
(5). 当我们这样分析, 队列中有效的数据的个数 (rear + maxSize - front) % maxSize // rear = 1 front = 0
3. 代码实现
import java.util.Scanner;
public class ArrayQueue {
private int maxSize; //数组的最大容量
private int front; // 队列头
private int rear; //队列尾
private int [] arr; //模拟队列
//创建队列
public ArrayQueue(int maxSize) {
this.maxSize=maxSize;
arr=new int [maxSize];
front=0;
rear=0;
}
//判断队列是否满
public boolean isFull() {
// return (rear)==maxSize-1;
return (rear+1)%maxSize==front;
}
//判断队列是否为空
public boolean isEmpty() {
return (rear==front);
}
//添加数组
public void addElement(int num) {
//判断队列是否满
if(isFull()) {
System.out.println("队列已满,不能加入");
return ;
}
//直接将数据加入
arr[rear]=num;
//将rear后移,考虑取模
// System.out.println(rear+"被填入"+num);
rear=(rear+1)%maxSize;
}
//获取队列数据,出队列
public int removeFront() {
//判断队列是否为空
if(isEmpty()) {
throw new RuntimeException("队列为空,不能取数据");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
//显示队列所有数据
public void showQueue() {
if(isEmpty()) {
System.out.println("队列为空,没有数据~");
return;
}
for(int i=front;i<front+size();i++) {
System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
}
}
//求出当前队列有效数据的个数
public int size() {
return ( (rear+maxSize-front)%maxSize );
}
//偷看队列头数据
public int peek() {
if(isEmpty()) {
throw new RuntimeException("队列为空,没有数据~");
}
return arr[front];
}
public static void main(String[] args) {
ArrayQueue queue=new ArrayQueue(4);
char key=' '; //接受用户输入
Scanner in=new Scanner(System.in);
boolean loop=true;
while(loop) {
System.out.println("show");
System.out.println("exit");
System.out.println("add");
System.out.println("get");
System.out.println("peek");
key=in.next().charAt(0);
switch(key) {
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("输入一个数");
int num=in.nextInt();
queue.addElement(num);
break;
case 'r':
try {
int res=queue.removeFront();
System.out.println("取出的数据是"+res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'p':
try {
int res=queue.peek();
System.out.println("对头数据是"+res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
in.close();
loop =false;
break;
default:
break;
}
}
}
}
4. 运行结果