当前位置: 首页 > 知识库问答 >
问题:

忽略某些条件的循环队列toString方法

景稳
2023-03-14

当我调用我的 toString() 方法时,如果在索引环绕(前面)之后,它不起作用

public class driver {
public static void main(String[] args) {

    Queue queue = new Queue(4);
    System.out.println(queue);
    queue.enqueue(1);
    queue.enqueue(2);
    queue.enqueue(3);
    queue.enqueue(4);
    System.out.println(queue);
    queue.dequeue();
    System.out.println(queue);

    queue.dequeue();
    System.out.println(queue);

    queue.enqueue(5);
    queue.enqueue(6);

    System.out.println(queue);


}

public static class Queue {

    int front;
    int rear;
    int capacity;
    int[] queue;

    public Queue(int size) {
        this.capacity = size;
        this.front = this.rear = -1;
        this.queue = new int[capacity];
    }

    @Override
    public String toString() {
        String str = "";
        if (front > rear) {
            int i = front;
            while (i != rear) {
                str = str + queue[i % queue.length] + " ";
                i++;
            }
            //str= str+queue[rear];
        }
        if (front < rear) {
            for (int i = front; i <= rear; i++) {
                str = str + queue[i];
            }
        }
        if (front == rear) {
            str = "This Queue is Empty. Please Enqueue";
        }

        return str;
    }


    public boolean isFull() {

        return ((rear == this.queue.length - 1 && front == 0) || rear == front - 1);

    }

    public boolean isEmpty() {
        return (front == -1);
    }

    public void enqueue(int elem) {
        if (isFull()) {
            System.out.println("Full Queue - dequeue an element if you need to add an element in the queue");
        } else {
            if (isEmpty()) {
                this.queue[++rear] = elem;
                front = 0;
            } else {
                rear = (rear + 1) % this.queue.length;
                this.queue[rear] = elem;
            }
        }
    }

    public int dequeue() {
        if (isEmpty()) {
            System.out.println("empty queue. Enqueue some elments. ");
            return -1;
        } else {
            int store = this.queue[front];

            if (rear == front) {
                front = rear = -1;
            } else {

                front = front + 1 % this.queue.length;

            }
            return store;

        }

    }

}

*这里也有一个返回的花括号,lol仍然是发布问题的新手。P、 S有人能帮我吗?因为显然我在问题中发布了太多代码。有什么变通办法吗?

共有1个答案

卓新知
2023-03-14

问题是toString的time循环中的i

考虑< code>front = 3和< code>rear = 1的情况,然后从< code>i = front = 3开始循环。但是,您会一直递增,直到达到< code>i == rear,这种情况从< code>rear开始就不会发生了

一旦达到< code >容量,您希望< code>i循环回到< code>0。您可以通过删除< code>i 并用< code>i = (i 1) % capacity替换它来实现这一点;

看起来您的代码中有一个不同的bug,因为当我运行它时,我看到

This Queue is Empty. Please Enqueue
1234
234
34
3 4 5

你需要自己弄清楚这一点。

您甚至可以将其压缩为单个for语句

for(int i = front; i != rear; i = (++i) % capacity)
 类似资料:
  • 项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现 项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时

  • 问题内容: 我正在编写的Python程序将从文件顶部读取一定数量的行,并且该程序需要保留此标头以备将来使用。目前,我正在做类似以下的事情: Pylint抱怨我没有使用该变量。什么是更pythonic的方式做到这一点? 编辑:该程序的目的是将原始文件智能地拆分为较小的文件,每个文件都包含原始标头和数据的子集。因此,在读取文件的其余部分之前,我只需要读取并保留标题。 问题答案: f = open(‘f

  • 假设我有一个大小为[10]的数组,当该数组被填满时,我想实现一个FIFO结构,而不是它只是填满了,因此无法向数组中添加新的东西,并抛出旧的东西。 例如,如果我有一个包含汽车制造商的字符串数组,当我的数组中有10个制造商时,我希望删除最旧的条目,添加最新的条目,但要考虑kepping FIFO。我如何在这样的方法中实现它:

  • 我正在制作一个不和谐机器人来跟踪在语音频道上花费的时间,但我想知道我是如何做到的,它不计算在某个频道上的成员的时间,比如afk频道。 这是我现在正在使用的事件

  • 我想知道是否可以使用此方法忽略字段,因为我有一个要忽略的字段列表,在同一个类中,那么我该如何做呢? 我正在使用 谢谢

  • 我有我的OAuth服务器和客户端,它是由Oauth2授权的。 现在,如果我需要呼叫我的服务,我需要: > 使用以下API从服务器生成访问令牌: < code > localhost:9191/oauth/token?grant _ type =密码 其给出如下响应: 现在我正在传递访问令牌,以运行客户端服务,如下所示: 我需要跳过控制器的身份验证。我该怎么做?有人能帮忙吗 我的WebSecurit