队列
队列是有序列列表(数组或链表),遵循先入先出的原则
基础队列
头指针front
:首元素的前一个位置。初始值-1
尾指针rear
:尾元素的位置。初始值-1
存数据时rear
动,取数据时front
动
缺点:该队列只能按顺序存取一次,指针位置不会循环变化,不能复用
环形队列
首尾相连
1.front
:指向队列的第一个元素,即arr[front]
就是队列的第一个元素。初始值0
2.rear
:指向队列末尾元素后一个位置,空出一个空间做为约定。初始值0
3.当队列满的条件:(rear + 1) % maxSize = front
4.对队列为空的条件:rear == front
5.当我们这样分析,队列中有效的数据的个数(rear + maxSize - front) % maxSize
代码 --> 队列
//使用数组模拟队列编写一个ArrayQueue类
public class ArrayQueue01 {
private int maxSize;
private int front;
private int rear;
private int[] arr;
//构造方法
public ArrayQueue01(int maxSize) {
this.maxSize = maxSize;
front = -1;//头指针,首元素的前一个位置
rear = -1;//尾指针,末尾元素的位置
arr = new int[maxSize];
}
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return rear == maxSize - 1;
}
public void addQueue(int data) {
if(isFull()) {
throw new RuntimeException("队列已满");
}
rear ++;//尾指针后移
arr[rear] = data;
}
public int getQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
front ++;
return arr[front];
}
public void show() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
for(int i = 0; i < arr.length; i ++) {
System.out.printf("arr[%d] = %d\n",i,arr[i]);
}
}
public int headQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
return arr[front + 1];
}
}
代码 --> 环形队列
public class CircleArrayQueue {
private int front = 0;
private int rear = 0;
private int maxSize;
private int[] arr;
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[maxSize];
}
public boolean isEmpty() {
return rear == front;
}
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
public void addValue(int value) {
if(isFull()) {
throw new RuntimeException("环形队列已满");
}
arr[rear] = value;
rear = (rear + 1) % maxSize;//环形队列首尾相连,取模是为了防止数组越界
}
public int getValue() {
if(isEmpty()) {
throw new RuntimeException("环形队列为空");
}
int value = arr[front];
front = (front + 1) % maxSize;//防止数组越界
return value;
}
public void showArr() {
if(isEmpty()) {
System.out.println("环形队列为空");
}
int num = (rear - front + maxSize) % maxSize;
for(int i = front; i < front + num; i ++) {
System.out.print(arr[i % maxSize] + "\t");
}
System.out.println();
System.out.println("头指针:" + front + "\t尾指针:" + rear);
}
public void headValue() {
if(isEmpty()) {
System.out.println("环形队列为空");
}
System.out.println("头指针为" + front + "\t值为" + arr[front]);
}
}