老师,为什么运行的结果是这个啊
来源:2-7 循环队列的实现
weixin_慕函数5207129
2021-01-06 21:55:16
public class LoopQueue<E> implements Queue<E> {
private E[] data;
//front 用于记录队首;tail用于记录队尾
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 void enqueue(E e) {
if((tail + 1) % data.length == front){
resize(getCapacity() * 2);
}
data[tail] = e;
tail = (tail + 1) % data.length;
size++;
}
@Override
public E dequeue() {
if(isEmpty()){
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
}
E ret = data[front];
data[front] = null;
front = (front + 1) % data.length;
size--;
if(size == getCapacity() / 4 && getCapacity() / 2 !=0){
resize(getCapacity() /2 );
}
return ret;
}
@Override
public E getFront() {
if(isEmpty()){
throw new IllegalArgumentException("Queue is empty");
}
return data[front];
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return front == tail;
}
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];
//在循环队列中 角标与实际位置 存在 front 的偏移 ,为了防止角标越界 %data.length
}
front = 0;
tail = size;
data = newData;
}
/**
在resize() 和 toString() 方法中,使用的遍历队列的方式是不一样的,但可以互相替换
*/
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Queue: size = %d , capacity = %d\n",size,getCapacity()));
res.append("front[");
//注意循环条件的写法 从front 开始,为防止脚标越界,i++之后再 %data.length
for (int i = front; i != tail;i = (i++) % data.length) {
res.append(data[i]);
if((i + 1) % data.length != tail){
res.append(',');
}
}
res.append("] tail");
return res.toString();
}
public static void main(String[] args) {
LoopQueue<Integer> queue = new LoopQueue<>();
for (int i = 0; i < 10; i++) {
queue.enqueue(i);
System.out.println(queue);
if(i % 3 == 2){
queue.dequeue();
System.out.println(queue);
}
}
}
}
D:\JDK\bin\java.exe "-javaagent:D:\idea\IntelliJ IDEA 2020.2.2\lib\idea_rt.jar=58822:D:\idea\IntelliJ IDEA 2020.2.2\bin" -Dfile.encoding=UTF-8 -classpath F:\Arithmetic\ArithmeticStudy\out\production\ArithmeticStudy;C:\Users\werey\.m2\repository\org\junit\jupiter\junit-jupiter\5.4.2\junit-jupiter-5.4.2.jar;C:\Users\werey\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.4.2\junit-jupiter-api-5.4.2.jar;C:\Users\werey\.m2\repository\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;C:\Users\werey\.m2\repository\org\opentest4j\opentest4j\1.1.1\opentest4j-1.1.1.jar;C:\Users\werey\.m2\repository\org\junit\platform\junit-platform-commons\1.4.2\junit-platform-commons-1.4.2.jar;C:\Users\werey\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.4.2\junit-jupiter-params-5.4.2.jar;C:\Users\werey\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.4.2\junit-jupiter-engine-5.4.2.jar;C:\Users\werey\.m2\repository\org\junit\platform\junit-platform-engine\1.4.2\junit-platform-engine-1.4.2.jar qurue.Main
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3536)
at java.base/java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:228)
at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:582)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:167)
at qurue.LoopQueue.toString(LoopQueue.java:93)
at java.base/java.lang.String.valueOf(String.java:3367)
at java.base/java.io.PrintStream.println(PrintStream.java:1047)
at qurue.Main.main(Main.java:14)
Process finished with exit code 1
1回答
liuyubobobo
2021-01-07
相似问题