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] 数据结构与算法经典问题解析