数组队列
1.1 队列处理方法
定义:队列是一种先进先出(FIFO)的线性表( 先存入队列的数据, 要先取出,后存入的要后取出)。对队列的基本操作有两种: 入队(Enqueue),在表的末端(队尾 tail)插入一个元素;出队(Dequeue),删除或返回在表的开头(队头 head)的元素。
场景:本人不是很喜欢使用递归,递归用以造成死循环,效率低,往往会使用队列代替递归。
1.2 数组模拟队列
数组模拟队列示意图:
思路:
- maxSize :队列容量(数组的长度)
- arr :模拟队列的数组
- front :指向队列头部元素的前一个元素,初始值为 -1
- rear :指向队列尾部元素,初始值为 -1
- 队列判空:front == rear
- 队列判满:rear == (maxSize - 1) ,即 rear 是否已经指向了数组的最后一个位置
- 队列元素个数:rear - front
- 队列入队:队列不满才能入队,arr[++rear] = value
- 队列出队:队列不空才能出队,return arr[front++]
代码实现:
public class ArrayQueue {
private int maxSize;
private int front = -1;
private int rear = -1;
private int[] arr;//模拟队列
public ArrayQueue(int arrMaxSize) {
maxSize = arrMaxSize;
arr = new int[arrMaxSize];
front = -1;//指向队列头部元素的前一个元素,初始值为 -1
rear = -1;//指向队列尾部元素,初始值为 -1
}
/**
* 判断是否已满
*
* @return
*/
public boolean isFull() {
return rear == (maxSize - 1);
}
/**
* 判断是否为空
*
* @return
*/
public boolean isEmpty() {
return front == rear;
}
/**
* 获得数组元素个数
*
* @return
*/
public int getElementNum() {
return rear - front;
}
/**
* 入队
*
* @param element
*/
public void addQueue(int element) {
if (!isFull()) {
arr[++rear] = element;
} else {
System.out.println("队列已满加入失败");
}
}
/**
* 出队
*
* @return
*/
public int getElement() {
if (!isEmpty()) {
front++;
return arr[front];
} else {
System.out.println("队列为空");
throw new RuntimeException("队列空,不能取数据");
}
}
public void showQueue() {
// 遍历
if (isEmpty()) {
System.out.println("队列空的,没有数据~~");
return;
}
for (int i = front + 1; i <= rear; i++) {
// Java 中也能用占位符诶
System.out.printf("数组队列原始列表: arr[%d]=%d\n", i, arr[i]);
}
}
/**
* 显示队列的头数据, 注意不是取出数据
* @return
*/
public int headQueue() {
// 判断
if (isEmpty()) {
throw new RuntimeException("队列空的,没有数据~~");
}
return arr[front + 1];
}
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(5);
queue.addQueue(10);
queue.addQueue(20);
queue.addQueue(30);
queue.addQueue(40);
int head = queue.headQueue();
System.out.println("头部元素:" + head);
int queueElement = queue.getElement();
System.out.println("获得数据:" + queueElement);
int queueElement1 = queue.getElement();
System.out.println("获得数据:" + queueElement1);
int queueElement2 = queue.getElement();
System.out.println("获得数据:" + queueElement2);
queue.showQueue();
}
}
头部元素:10
获得数据:10
获得数据:20
获得数据:30
数组队列原始列表: arr[3]=40