java的Queue的问题

可以请教一下怎么修改代码才能出这样的输出呢

public class Queue {
    private Double[] values;
    private int front;
    private int rear;
    private int counter;
    
    public Queue(int size) {
        values = new Double[size];
        front = 0;
        rear = -1;
        counter = 0;
    }
    public boolean isEmpty() {
        if(this.front == this.rear) {
            return true;
        }
        return false;
    }
    public boolean isFull() {
        if(front == (rear+1) % values.length) {
            return true;
        }
        return false;
    }
    public Double enqueue(double x) {
        if(isFull()) {
            return null;
        }else {
            rear = (rear + 1) % values.length;
            values[rear] = Double.valueOf(x);
            counter++;
            return values[rear];
        }
    }
    public Double dequeue() {
        if(isEmpty()) {
            return null;
        }else {
            
            front = (front + 1) % values.length;
            counter--;
            return values[front];
        }
    }
    public void displayQueue() {
        if(isEmpty()) {
            System.out.println("Empty queue!");
            return;
        }
        System.out.print("front-> ");
        for(int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
            }
    public static void main(String[] args) {
        Queue myQueue = new Queue(4);
        myQueue.enqueue(-2);
        myQueue.enqueue(3);
        myQueue.enqueue(1);
        System.out.println("The queue has 3 items: -2, 3, 1");
        myQueue.displayQueue();
        myQueue.enqueue(8);
        myQueue.enqueue(6);
        System.out.println("The queue has 4 items: -2, 3, 1, 8");
        myQueue.displayQueue();        
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue has 2 items: 1, 8");
        myQueue.displayQueue();
        myQueue.dequeue();
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue is empty:");
        myQueue.displayQueue();

    }
    

}


我想要的效果:

The queue has 3 items: -2, 3, 1
front -> | -2.0000 |
| 3.0000 |
| 1.0000 | < - rear
The queue has 4 items: -2, 3, 1, 8
front -> | -2.0000 |
| 3.0000 |
| 1.0000 |
| 8.0000 | < - rear
The queue has 2 items: 1, 8
front -> | 1.0000 |
| 8.0000 | < - rear
The queue is empty:
Empty queue!

运行结果及报错内容 :

The queue has 3 items: -2, 3, 1
front-> null
null
null
null
The queue has 4 items: -2, 3, 1, 8
front-> null
null
null
null
The queue has 2 items: 1, 8
front-> null
null
null
null
The queue is empty:
front-> null
null
null
null

题主的代码主要是 isEmpty,isFull 和 displayQueue 三个方法有问题,需要修改一下


public class Queue {
    private Double[] values;
    private int front;
    private int rear;
    private int counter;

    public Queue(int size) {
        values = new Double[size];
        front = 0;
        rear = -1;
        counter = 0;
    }
    public boolean isEmpty() {
        return counter == 0;
    }
    public boolean isFull() {
        return counter == values.length;
    }
    public Double enqueue(double x) {
        if(isFull()) {
            return null;
        }else {
            rear = (rear + 1) % values.length;
            values[rear] = x;
            counter++;
            return values[rear];
        }
    }
    public Double dequeue() {
        if(isEmpty()) {
            return null;
        }else {
            front = (front + 1) % values.length;
            counter--;
            return values[front];
        }
    }
    public void displayQueue() {
        if(isEmpty()) {
            System.out.println("Empty queue!");
            return;
        }
        System.out.print("front-> ");
        for(int i = front; i <= rear; i++) {
            System.out.println(values[i]);
        }
        System.out.println("<-rear");
    }
    public static void main(String[] args) {
        Queue myQueue = new Queue(4);
        myQueue.enqueue(-2);
        myQueue.enqueue(3);
        myQueue.enqueue(1);
        System.out.println("The queue has 3 items: -2, 3, 1");
        myQueue.displayQueue();
        myQueue.enqueue(8);
        myQueue.enqueue(6);
        System.out.println("The queue has 4 items: -2, 3, 1, 8");
        myQueue.displayQueue();
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue has 2 items: 1, 8");
        myQueue.displayQueue();
        myQueue.dequeue();
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue is empty:");
        myQueue.displayQueue();
    }
}

看了你的代码,里面的定义front和rear是代表 头部下标和尾部下标是吧,其实可以不用那么复杂,给你一个参考怎么实现队列:
https://blog.csdn.net/jsc123581/article/details/81986714


public class Queue {
    private Double[] values;
    private int front;
    private int rear;
    private int counter;

    public Queue(int size) {
        values = new Double[size];
        front = 0;
        rear = -1;
        counter = 0;
    }

    public boolean isEmpty() {
        return counter == 0;
    }

    public boolean isFull() {
        return counter == values.length;
    }

    public Double enqueue(double x) {
        if (isFull()) {
            return null;
        } else {
            rear = (rear + 1) % values.length;
            values[rear] = x;
            counter++;
            return values[rear];
        }
    }

    public Double dequeue() {
        if (isEmpty()) {
            return null;
        } else {
            front = (front + 1) % values.length;
            counter--;
            return values[front];
        }
    }

    public void displayQueue() {
        if (isEmpty()) {
            System.out.println("Empty queue!");
            return;
        }
        System.out.print("front-> ");
        for (int i = front; i <= rear; i++) {
            System.out.print(String.format("| %f |", values[i]));
            if (i != rear) {
                System.out.println("");
            }
        }
        System.out.println("<-rear");
    }

    public static void main(String[] args) {
        Queue myQueue = new Queue(4);
        myQueue.enqueue(-2);
        myQueue.enqueue(3);
        myQueue.enqueue(1);
        System.out.println("The queue has 3 items: -2, 3, 1");
        myQueue.displayQueue();
        myQueue.enqueue(8);
        myQueue.enqueue(6);
        System.out.println("The queue has 4 items: -2, 3, 1, 8");
        myQueue.displayQueue();
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue has 2 items: 1, 8");
        myQueue.displayQueue();
        myQueue.dequeue();
        myQueue.dequeue();
        myQueue.dequeue();
        System.out.println("The queue is empty:");
        myQueue.displayQueue();
    }
}

看了一下这个queue是一个先入先出的队列,使用数组和front、rear构建一个循环数组。个人觉得存在的几个问题:
1.front、real的计算不应该使用求余方式,求余计算效率不高。
2.ifFull没有考虑初始条件下,real+1==0==front但此时queue为空
3.isEmpty初始条件下rear=-1,front=0此时queue应该为空,但没有考虑到,
4.你已经定义了一个counter为什么不直接使用counter==0判断empty,counter==size判断队列已满?这样只需要维护counter值就可以了。
4.dequeue方法出队后应该将数组对应的下标元素置为null,方便垃圾回收期回收该对象,否则会造成内存泄漏
5.display方法应该按照元素入队顺序展示,而且假如空队列也会展示null值。

下面是我的思路哈,可以参考一下:

public class Queue<E> {
    private Object[] array;
    private int front;
    private int rear;
    private int count;
    private int size;

    public Queue(int size) {
        if (size <= 0)
            throw new IllegalArgumentException("队列的大小必须大于0");
        this.array = new Object[size];
        this.rear = -1;
        this.size = size;
    }

    public boolean isFull() {
        return count == size;
    }

    public boolean isEmpty() {
        return count == 0;
    }

    public E enqueue(E element) {
        if (isFull())
            return null;
        //如果已到达数组末端,则在数组0下标处增加元素
        if (rear + 1 == size)
            rear = -1;
        count++;
        return (E) (array[++rear] = element);
    }


    public E dequeue() {
        if (isEmpty())
            return null;
        Object res = array[front];
        //从数组中删除,防止内存泄露
        array[front] = null;
        //如果已经删除到数组末尾则从数组开头继续删除
        if(front + 1 == size){
            front = 0;
        }else{
            front++;
        }
        count--;
        return (E) res;
    }

    public void displayQueue() {
        if (isEmpty()) {
            System.out.println("Empty queue!");
            return;
        }
        StringBuilder sb = new StringBuilder("front-> " + array[front]);
        if (rear > front) {
            //这种情况对是添加元素时没有超出数组末端
            for (int i = front + 1; i <= rear; i++) {
                sb.append(", ");
                sb.append(array[i]);
            }
        } else if (rear != front) {
            //这种情况时添加数组元素时已经超出数组末端且数组开端处已经删除元素
            //因此有效元素应该时front -> 数组末端 + 0 -> rear
            for (int i = front + 1; i < size; i++) {
                sb.append(", ");
                sb.append(array[i]);
            }
            for (int i = 0; i <= rear; i++) {
                sb.append(", ");
                sb.append(array[i]);
            }
        }
        sb.append(" <-rear");
        System.out.println(sb);
    }

    @Override
    public String toString() {
        return Arrays.toString(array);
    }

    public static void main(String[] args) {
        Queue<Integer> q = new Queue<>(4);
        q.enqueue(1);
        q.enqueue(2);
        q.enqueue(3);
        q.enqueue(4);
        q.enqueue(5);
        q.displayQueue();
        q.dequeue();
        q.dequeue();
        q.displayQueue();
        q.enqueue(6);
        q.enqueue(7);
        q.enqueue(8);
        q.displayQueue();
        q.dequeue();
        q.dequeue();
        q.displayQueue();
        q.dequeue();
        q.dequeue();
        q.displayQueue();
    }
}