老师,为什么运行的结果是这个啊

来源: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

先确认一下在你的环境直接运行课程的官方代码是否有问题?


​传送门:https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures 


0
heixin_慕函数5207129
hp>发现问题了,toString()循环里面的 ++i写成i++了,谢谢老师

h021-01-07
共1条回复

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2603 学习 · 1086 问题

查看课程