Java循环队列与非循环队列的区别总结
什么是队列?
队列是计算机科学中一种常见的抽象数据类型,它代表了一组可以按顺序访问的元素,遵循 "先进先出" (FIFO) 的原则,也就是最先进入队列的元素最先被处理和弹出。
非循环队列
非循环队列是最普通的队列,也是最容易实现的。非循环队列采用静态数组或动态数组来实现。队列的读取位置(front) 和写入位置(rear) 需要时刻维护,它们初始值都为 -1。写入新数据时,将 rear 加 1,再将该位置上赋值为新的数据;从队列里弹出数据时,将front加1。当队列空时,front == rear;当队列满时,任何写操作都将被拒绝。
非循环队列示例
以下是一个非循环队列的基本实现示例:
public class ArrayQueue<E> {
private E[] data;
private int front, rear;
public ArrayQueue(int capacity) {
data = (E[]) new Object[capacity];
front = -1;
rear = -1;
}
public boolean isEmpty() {
return front == rear;
}
public boolean isFull() {
return rear == data.length - 1;
}
public void enqueue(E item) {
if (isFull()) {
throw new RuntimeException("Queue is full");
}
data[++rear] = item;
}
public E dequeue() {
if (isEmpty()) {
throw new NoSuchElementException("Queue is empty");
}
return data[++front];
}
}
循环队列
循环队列和非循环队列的实现方式略有不同,循环队列会将数组当作环形数据结构来使用。相对于非循环队列,循环队列节省了数组的存储空间,但是编写起来更加复杂,需要处理队列队首和队尾指针的位置。循环队列的读取和写入合在一起,写入位置(rear) 和读取位置(front) 初始值都为0。向队列里添加新元素时,将rear指针往后移动一位,如果移动到队列尾部就从头开始;同理,从队列里弹出数据时,将front指针向后移动一位。当队列空时,front == rear;当队列满时,(rear+1) % data.length == front。
循环队列示例
以下是一个循环队列的基本实现示例:
public class CircularQueue<E> {
private E[] data;
private int front, rear;
public CircularQueue(int capacity) {
data = (E[]) new Object[capacity];
front = 0;
rear = 0;
}
public boolean isEmpty() {
return front == rear;
}
public boolean isFull() {
return (rear + 1) % data.length == front;
}
public void enqueue(E item) {
if (isFull()) {
throw new RuntimeException("Queue is full");
}
data[rear] = item;
rear = (rear + 1) % data.length;
}
public E dequeue() {
if (isEmpty()) {
throw new NoSuchElementException("Queue is empty");
}
E item = data[front];
front = (front + 1) % data.length;
return item;
}
}
总结
相比于非循环队列,循环队列具有以下优点:
- 更节省存储空间
- 更高效地利用数组,操作难度稍低
- 可以避免数组的内部碎片(数组不必满),从而提高性能
然而,循环队列相对于非循环队列也更加复杂,需要特殊考虑大量极端情况及边界情况。因此,在实际使用过程中,需要根据实际需求来选择合适的队列实现方式。
以上就是 Java循环队列与非循环队列的区别总结,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java循环队列与非循环队列的区别总结 - Python技术站