1.概念
- 队列是一个有序列表,可以用数组或是链表来实现。
- 先存入队列的数据,要先取出。后存入的要后取出,遵循先入先出的原则。
- 允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
- 入队:向队列中插入新的数据元素,新入队的元素就成为了队列的队尾元素。
- 出队:从队列中删除队头元素,其后继元素成为新的队头元素。


2.数组模拟队列
public class ArrayQueueDemo {
public static void main(String[] args) {
//创建一个队列
ArrayQueue arrayQueue = new ArrayQueue(3);
char key = ' ';//接受用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while (loop) {
System.out.println("==========================");
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':
arrayQueue.showQueue();
break;
case 'a':
System.out.println("请输入一个数:");
int value = scanner.nextInt();
arrayQueue.addQueue(value);
break;
case 'g':
try {
int queue = arrayQueue.getQueue();
System.out.println("取出的数据:" + queue);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int head = arrayQueue.headQueue();
System.out.println("队列的头部数据是:" + head);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
}
}
System.out.println("程序退出");
}
}
//使用数组模拟队列
class ArrayQueue {
private int maxSize;//数组的最大容量
private int front;//指向队列头
private int rear;//指向尾部
private int[] arr;//该数据用于存放数据,模拟队列
//创建队列
public ArrayQueue() {
}
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
front = -1; //指向队列头部,指向队列头的前一个位置
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 showQueue() {
//判断是否为空
if (isEmpty()) {
System.out.println("队列为空,无法遍历");
}
for (int i = 0; i < maxSize; i++) {
System.out.printf("arr[%d]=%d\n", i, arr[i]);
}
}
/**
* 显示队列的头部,仅显示
*/
public int headQueue() {
//判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列为空~");
}
return arr[front + 1];
}
}
3.环形队列
将上述队列优化为环形队列
思路分析:
- 1.fornt变量的含义调整:front指向队列的第一个元素。front初始值=0
- 2.rear变量的含义调整:rear指向队列的最后一个元素的后一个位置。rear初始值=0
- 3.当队列满时:(rear+1)%maxSize==front。
- 4.当队列为空时:rear=front
- 5.队列中有效数据的个数:(rear+maxSize-front)%maxSize
public class CircleArrayQueueDemo {
public static void main(String[] args) {
//创建一个队列
CircleArrayQueue arrayQueue = new CircleArrayQueue(5);
char key = ' ';//接受用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while (loop) {
System.out.println("==========================");
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':
arrayQueue.showQueue();
break;
case 'a':
System.out.println("请输入一个数:");
int value = scanner.nextInt();
arrayQueue.addQueue(value);
break;
case 'g':
try {
int queue = arrayQueue.getQueue();
System.out.println("取出的数据:" + queue);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int head = arrayQueue.headQueue();
System.out.println("队列的头部数据是:" + head);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
}
}
System.out.println("程序退出");
}
}
//使用数组模拟队列
class CircleArrayQueue {
private int maxSize;//数组的最大容量
private int front;//指向队列的第一个元素
private int rear;//指向尾部
private int[] arr;//该数据用于存放数据,模拟队列
//创建队列
public CircleArrayQueue() {
}
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
front = 0; //指向队列头部,指向队列头的前一个位置
rear = 0; //指向队列尾部,指向队列的最后一个数据
}
/**
* 判断队列是否满
*/
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
/**
* 判断队列是否为空
*/
public boolean isEmpty() {
return rear == front;
}
/**
* 添加数据到队列
*/
public void addQueue(int n) {
//判断队列是否满
if (isFull()) {
System.out.println("队列已满~");
return;
}
//直接将rear加入
arr[rear] = n;
rear = (rear + 1) % maxSize;
}
/**
* 从队列移除数据
*/
public int getQueue() {
//判断队列是否空
if (isEmpty()) {
throw new RuntimeException("队列为空~");
}
//front指向队列的第一个元素
//1.先把front对应的值保存到临时变量
//2.将front后移
//3.降临时保存的变量返回
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
/**
* 显示队列的所有数据
*/
public void showQueue() {
//判断是否为空
if (isEmpty()) {
System.out.println("队列为空,无法遍历");
}
//从front开始遍历
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 headQueue() {
//判断是否为空
if (isEmpty()) {
throw new RuntimeException("队列为空~");
}
return arr[front];
}
}
本文介绍了如何用Java实现队列的概念,包括数组模拟的队列结构,以及如何优化为环形队列,展示了队列的基本操作如添加、出队和头部信息的获取。
1361

被折叠的 条评论
为什么被折叠?



