package DataDtructure;
/**
* ClassName: LoopQueue
* Company:华中科技大学电气学院
* date: 2019/8/23 16:23
* author: YEXIN
* version: 1.0
* since: JDK 1.8
* Description:实现循环队列,不再使用动态数组了
*/
public class LoopQueue<E> implements Queue<E> {
private E[] data;
private int front,tail;
private int size;
public LoopQueue(int capacity){
data = (E[])new Object[capacity+1];
front = 0;
tail = 0;
size = 0;
}
public LoopQueue(){
this(10);
}
public int getCapacity(){
return data.length -1;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return tail == front;
}
@Override
public void enqueue(E e) {
if((tail+1)% data.length == front){//队列满了
resize(getCapacity()*2);//扩容
}
data[tail] = e;
tail = (tail+1)%data.length;
size++;
}
private void resize(int newCapacity){
E[] newdata = (E[])new Object[newCapacity + 1];
for(int i = 0;i < size; i++){
newdata[i] = data[(i+front)% data.length];
}
data = newdata;
front = 0;
tail = size;
}
@Override
public E getFront() {
if(isEmpty()){
throw new IllegalArgumentException("the Queue is empty");
}
return data[front];
}
@Override
public E dequeue() {
if(isEmpty()){
throw new IllegalArgumentException("the Queue is empty");
}
E res = data[front];
data[front]=null;
front = (front+1)%data.length;
size--;
if(size == getCapacity()/4 && data.length/2 != 0){
resize(data.length/2);
}
return res;
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Queue:size = %d,capacity = %d\n",size,getCapacity()));
res.append("front [");
for(int i = front ;i != tail; i=(i+1)%data.length){
res.append(data[i]);
if((i+1)%data.length != tail){
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
}
java实现数据结构---循环队列
最新推荐文章于 2023-02-25 19:18:03 发布
本文介绍了一种不使用动态数组的循环队列实现方法,详细解释了循环队列的基本操作,如enqueue、dequeue、getFront等,并提供了自动扩容和缩容的策略。

1644

被折叠的 条评论
为什么被折叠?



