主要思想:采用双指针,指针front永远指向队列第一个元素,指针rear永远指向队列最后一个元素位置+1,初始值皆为0;front与rear之间约定预留一个位置,即若初始化数组容量为10(maxSize),则有效存储位只有9个。
使用公式:(rear + maxSize - front) % maxSize 可求出队列中元素个数。
public class ArrayQueueDemo{
public static void main(String[] args) {
ArrayQueue q = new ArrayQueue(10); // 有效数据位为9,永远空出一个位置(约定)
q.showQueue();
for (int i = 0; i < 10; i++) {
try {
q.addQueue(i);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
q.showQueue();
for (int i = 0; i < 3; i++ ){
try {
System.out.println("取出:" + q.fetchQueue());
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
q.showQueue();
try {
q.addQueue(3);
q.addQueue(4);
q.addQueue(5);
q.addQueue(3);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
q.showQueue();
}
}
class ArrayQueue{
private int maxSize;
private int front;
private int rear;
private int[] arr;
public ArrayQueue() {
}
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.arr = new int[maxSize];
}
public boolean isEmpty() {
return size() == 0;
}
public boolean isFull() {
return size() == maxSize - 1;
}
public int size() {
return (rear + maxSize - front) % maxSize;
}
public void addQueue(int n) throws RuntimeException{
if (isFull()){
throw new RuntimeException("队列已满!");
}
arr[rear] = n;
rear = (rear + 1) % maxSize;
System.out.println("Success!");
}
public int fetchQueue() {
if (isEmpty()){
throw new RuntimeException("队列是空的!");
}
int value = arr[front];
arr[front] = 0;
front = (front + 1) % maxSize;
return value;
}
public void showQueue() {
for (int i = 0; i < maxSize; i++){
System.out.printf("arr[%d]: %d\n", i, arr[i]);
}
}
}