2.队列
作者:互联网
一、定义
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
二、模拟思路
-
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量
-
因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示
三、入队出队操作模拟
当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:
-
将尾指针往后移:rear+1 , 当 front == rear 时,队列为空
-
若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear所指的数组元素中,否则无法存入数据。rear == maxSize - 1时,队列满
注意:front指向的是队列首元素的前一个位置
实现代码
public class Demo3 {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(5);
queue.addNum(1);
queue.addNum(2);
queue.addNum(3);
queue.addNum(4);
queue.addNum(5);
System.out.println(queue.getNum());
queue.showQueue();
}
}
class ArrayQueue {
//队列的大小
int maxSize;
//用数组来实现队列
int[] arr;
//指向队列首元素的前一个位置
int front;
//指向队列的尾元素
int rear;
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[this.maxSize];
//front指向队列首元素的前一个位置
front = -1;
rear = -1;
}
public boolean isFull() {
return rear == maxSize - 1;
}
public boolean isEmpty() {
return front == rear;
}
public void addNum(int num) {
if(isFull()) {
System.out.println("队列已满,无法在进行入队操作");
return;
}
//队尾标记后移,指向要放入的元素的位置
rear++;
arr[rear] = num;
}
public int getNum() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法出队");
}
//队首标记后移,指向队首元素
System.out.print("出队元素是:");
front++;
return arr[front];
}
public void showQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法遍历");
}
System.out.println("遍历队列");
//从front+1开始读取元素
for(int start = front+1; start<=rear; start++) {
System.out.println(arr[start]);
}
}
}Copy
运行结果
出队元素是:1
遍历队列
2
3
4
5Copy
四、环形队列
思路:
- front变量指向队首元素,初值为0
- rear变量指向队尾元素的下一个元素,初值为0。规定空出一个位置
- 队列为空的判定条件:front == rear
- 队列为满的判定条件:(rear + 1) % maxSize == front
- 队列中有效元素的个数:(rear - front + maxSize) % maxSize
- 入队和出队时,都需要让标记对maxSize取模
代码
public class Demo4 {
public static void main(String[] args) {
ArrayAroundQueue aroundQueue = new ArrayAroundQueue(5);
aroundQueue.addNum(1);
aroundQueue.addNum(2);
aroundQueue.addNum(3);
aroundQueue.addNum(4);
aroundQueue.showQueue();
System.out.println(aroundQueue.getNum());
System.out.println(aroundQueue.getNum());
aroundQueue.addNum(5);
aroundQueue.addNum(6);
aroundQueue.showQueue();
aroundQueue.getHead();
}
}
class ArrayAroundQueue {
//队列的大小
int maxSize;
//用数组来实现队列
int[] arr;
//指向队列首元素的前一个位置
int front;
//指向队列的尾元素
int rear;
public ArrayAroundQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[this.maxSize];
//front指向队列首元素的前一个位置
front = 0;
rear = 0;
}
public boolean isFull() {
return (rear+1)%maxSize == front;
}
public boolean isEmpty() {
return front == rear;
}
public void addNum(int num) {
if(isFull()) {
System.out.println("队列已满,无法在进行入队操作");
return;
}
//先放入元素,在后移队尾标记
arr[rear] = num;
rear = (rear+1)%maxSize;
}
public int getNum() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法出队");
}
//队首标记后移,指向队首元素
System.out.print("出队元素是:");
int num = arr[front];
front = (front+1)%maxSize;
return num;
}
public void showQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空,无法遍历");
}
System.out.println("遍历队列");
//当front + 1 == rear时停止遍历
int start = front;
while(start != rear) {
System.out.println(arr[start]);
//移动到下一个元素
start = (start+1)%maxSize;
}
}
public void getHead() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
System.out.println("队首元素为:"+arr[front]);
}
}Copy
运行结果
遍历队列
1
2
3
4
出队元素是:1
出队元素是:2
遍历队列
3
4
5
6
队首元素为:3
标签:队列,int,maxSize,front,public,rear 来源: https://www.cnblogs.com/55zjc/p/15972120.html