一、队列的介绍
队列是 有序 的,可以用 数组 或者 链表来实现,而且队列遵循一个 先入先出 的原则,即存入队列的数据,要先取出,后存入的要后取出。
二、用数组模拟队列思路
1、队列是有序的,若使用数组的结构来存储队列的数据,首先要用 maxsize 来指定队列的最大容量。
2、因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如果用C语言中的指针描述就是队首指针与队尾指针。
三、数组模拟队列图示
四、使用java语言描述队列
4.1 定义一个ArrayQueue类
package point3;
/*
编写ArrayQueue类
*/
public 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 ifFull(){
return rear == maxSize - 1;
}
// 判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
// 添加数据到队列
public void addQueue(int n){
// 判断队列是否满了
if (ifFull()){
System.out.println("队列满,不能加入数据");
return;
}
rear++; // 让rear后移
arr[rear] = n;
}
// 获取队列的数据,出队列
public int getQueue(){
// 判断队列是否为空
if (isEmpty()){
// 通过抛出异常
throw new RuntimeException("队列空,不能取数据");
}
front++; // front后移
return arr[front];
}
// 显示队列的所有数据
public void showQueue() {
// 遍历
if (isEmpty()) {
System.out.println("队列空的,没有数据");
return;
}
for (int i = rear; i > front; i--) {
if (i==front+1){
System.out.printf("%d", arr[i]);
}
else {
System.out.printf("%d-->", arr[i]);
}
}
}
// 显示队列的头数据, 注意不是取出数据
public int headQueue() {
// 判断
if (isEmpty()) {
throw new RuntimeException("队列空的,没有数据~~");
}
return arr[front + 1];
}
}
4.2 编写一个用户操作界面ArrayQueueTest
package point3;
import java.util.Scanner;
import java.util.concurrent.CancellationException;
/*
利用数组模拟队列思路
1、队列本身是有序列表,若使用数组的结构来存储队列的数据,其中 maxSize 是该队列的最大容量。
2、因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front
会随着数据输出而改变,而 rear 则是随着数据输入而改变。
3、当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析
(1)将尾指针往后移:rear+1 , 当 front == rear 【空】
(2)若尾指针 rear小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。
rear == maxSize - 1[队列满]
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
// 创建一个队列
ArrayQueue queue = new ArrayQueue(3);
char key = ' '; // 接受用户输入
Scanner scanner = 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):查看队列头的数据");
System.out.println("请输入操作指令:");
key = scanner.next().charAt(0);// 接受一个字符
switch (key){
case 's':
System.out.println("队列中的数据为");
queue.showQueue();
break;
case 'a':
System.out.println("请输入一个数");
int value = scanner.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",res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println();
break;
case 'e': // 退出
scanner.close(); loop = false;
break;
default:
break;
}
System.out.println();
}
}
}
4.3 运行结果
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
s
队列中的数据为
队列空的,没有数据
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
a
请输入一个数
1
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
a
请输入一个数
2
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
a
请输入一个数
3
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
a
请输入一个数
4
队列满,不能加入数据
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
s
队列中的数据为
3-->2-->1
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
h
队列头的数据是:1
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
g
取出的数据是:1
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
s
队列中的数据为
3-->2
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
h
队列头的数据是:2
s(show):显示队列
e(exit):退出程序
a(add):添加数据到队列
g(get):从队列中取出数据
h(head):查看队列头的数据
请输入操作指令:
e
Process finished with exit code 0