首先我们来看一个队列在实际生活中的场景
我们在银行办理业务,是不是会看到这样一种场景,有一队人正整齐的排着队,在窗口前,等待办理业务,其实这就是队列在实际应用中的一个体现。
队列的特点
- 队列的是Java数据结构中的一种,它的一个有序的 列表 ,可以使用数组或者链表来实现。
- 遵循先进先出的原则,先存入的数据会先被取出来,后存入的数据会后取出来
队列的形式
- 单向队列
- 环形队列
数组模拟单向队列
- 图解队列
- maxsize :该队列中最大能存储的元素个数
- front :队列的头部,它随着队列元素的输出而改变,初始值赋值为-1
- rear: 队列的尾部,它随着队列的增加而改变,初始值赋值为-1
- array[maxSize] : 存放数据的数组
- 向队列中存入数据,首先判断该队列是否已经存满,再存入队列中
- 向队列取出数据,首先判断该队列是否为空,在向队列取出元素
- 判断队列已满:
rear == maxSize-1
; - 判断队列为空:
rear == front
代码实现
public class ArrayQueue {
/*用于存储数据的数组*/
private int[] array;
/*队列头部*/
private int front;
/*队列的尾部*/
private int rear;
/*队列中最大存储个数*/
private int maxSize;
public ArrayQueue(maxSize) {
this.array = new int[maxSize];
this.maxSize = maxSize;
this.front = -1;
this.rear = -1;
}
/**
* 判断该队列是否已满
* @return true-已满 | false-不满
*/
private boolean isFull() {
return rear == maxSize-1;
}
/**
* 判断该队列是否为空
* @return true-空 | false-否
*/
public boolean isEmpty() {
return rear == front;
}
/**
* 向队列中添加元素
* @param 要添加的元素
* @return true-成功 | false-失败
*/
public boolean addQueue(int num) {
if (isFull) {
System.out.print("队列已满无法添加");
return false;
}
rear++;
array[rear] = num;
return true;
}
/**
* 获取队列头部的元素
* @return 元素值
*/
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空,不能取出队列!!!");
}
int num = array[front];
front--;
return num;
}
/**
* 显示队列
*/
public void showQueue() {
if (isEmpty()) {
System.out.print("队列为空,不能打印队列");
return;
}
for (int i = 0;i < this.array.length;i++) {
System.out.print(array[i]);
}
}
}
代码写完了,我们这种方式存在一种问题,就是当我们取出数据后,front指针无法回到原来的位置,导致我们这个队列只能使用一次,所以我们引出了下面一种队列环形队列
数组实现环形队列
- 图解环形队列
- maxsize :该队列中最大能存储的元素个数
- front :队列的头部,它随着队列元素的输出而改变,初始值赋值为0
- rear: 队列的尾部,它随着队列的增加而改变,初始值赋值为0
- array[maxSize] : 存放数据的数组
- 向队列中存入数据,首先判断该队列是否已经存满,再存入队列中
- 向队列取出数据,首先判断该队列是否为空,在向队列取出元素
- 判断队列已满:
(rear+1)%maxSize == front
; - 判断队列为空:
rear == front
- 计算队列中有效数据
(rear+maxSize-front)%maxSize
代码实现
public class ArrayQueue {
/*用于存储数据的数组*/
private int[] array;
/*队列头部*/
private int front;
/*队列的尾部*/
private int rear;
/*队列中最大存储个数*/
private int maxSize;
public ArrayQueue(maxSize) {
this.array = new int[maxSize];
this.maxSize = maxSize;
this.front = 0;
this.rear = 0;
}
/**
* 判断该队列是否已满
* @return true-已满 | false-不满
*/
private boolean isFull() {
return (rear+1)%maxSize == front;
}
/**
* 判断该队列是否为空
* @return true-空 | false-否
*/
public boolean isEmpty() {
return rear == front;
}
/**
* 向队列中添加元素
* @param 要添加的元素
* @return true-成功 | false-失败
*/
public boolean addQueue(int num) {
if (isFull) {
System.out.print("队列已满无法添加");
return false;
}
array[rear] = num;
rear = (rear+1)%maxSize;
return true;
}
/**
* 获取队列头部的元素
* @return 元素值
*/
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空,不能取出队列!!!");
}
int num = array[front];
front = (front+1)%maxSize;
return num;
}
/**
* 显示队列
*/
public void showQueue() {
if (isEmpty()) {
System.out.print("队列为空,不能打印队列");
return;
}
for (int i = 0;i < (rear+maxSize-front)%maxSize;i++) {
System.out.print(array[i]);
}
}
}
以上就是两种形式的用数组实现的队列。能力有限仅供参考!!!