1 前言
上一篇写了《基于简单循环数组实现队列:Java语言实现》,但是一旦队列的最大空间给出,满栈后再执行入队操作将会产生溢出异常,这里采用采用动态数组的方法实现循环队列。
2 基于动态数组实现循环队列
package Queue_Study;
/**
* Created by Administrator on 2018/5/13.
*/
public class DynamicArrayQueue {
private int front;//队首下标
private int rear;//队尾下标
private int[] array;//用数组实现队列
private int capacity;//容量
public DynamicArrayQueue(int capacity) {
this.capacity = capacity;
array = new int[capacity];
front = 0;
rear = 0;
}
//判断队列中是否有元素
public boolean isEmpty() {
return front == rear;
}
//判断队列中是否存满元素
public boolean isFull() {
return ((rear + 1) % capacity == front);
}
//队列扩容
private void resizeQueue() {
int initCapacity = capacity;
capacity *= 2;
int[] oldArray = array;
array = new int[this.capacity];
for(int i=0;i<oldArray.length;i++) {
array[i] = oldArray[i];
}
if(rear < front) {
for(int i=0;i < front;i++) {
array[i+initCapacity] = this.array[i];
}
rear = rear + initCapacity;
}
}
//入队操作:在队列的队尾插入一个元素
public void enQueue(int data) {
if(isFull()) {
resizeQueue();
}
array[rear] = data;
rear = (rear + 1) % capacity;
}
//出队操作:删除并返回队首的元素
public int deQueue() {
if(isEmpty()) {
System.out.println("错误:队列为空");
return 0;
}else {
int data = array[front];
front = (front + 1) % capacity;
return data;
}
}
}
3 测试
package Queue_Study;
/**
* Created by Administrator on 2018/5/13.
*/
public class DynamicArrayQueueTest {
public static void main(String[] args) {
DynamicArrayQueue q = new DynamicArrayQueue(2);
q.enQueue(1);
q.enQueue(2);
q.enQueue(3);
q.enQueue(4);
System.out.println(q.deQueue());
System.out.println(q.isEmpty());
System.out.println(q.isFull());
}
}
4 参考资料
[1] 基于简单循环数组实现队列:Java语言实现
[2] 数据结构与算法经典问题解析