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

当我在循环数组队列中取消排队时,我的项目无法正确显示

后烨煜
2023-03-14

在我的循环数组队列中,有一些部分还没有完成,但我已经完成了足够的工作,我的主要方法可以发挥作用。然而,由于某种原因,当我使用我的出列函数时,它似乎在检索前端时工作正常,但与再次显示队列时相比,我的所有项目都不会显示,但队列仍然可以检索前端并迭代到下一个项目。

我曾尝试在线查看其他出列方法,以了解我可能出错的地方,但没有效果,因为它们看起来都与我的方法类似。我检查了是否必须将队列[frontIndex]设置为空,但当我将其设置为下一个变量时,它不会删除上一个项目,也不会正确显示,即:1-2-3-4-5(出列后)2-2-4-4

这些是我的变量以及我的出列方法

private T[] queue; //Circular array of queue entries and one unused element 
private int frontIndex;
private int backIndex;
private boolean integrityOK;
private static final int DEFUALT_CAPACITY = 50;
private static final int MAX_CAPACITY = 10000;

    /////////////////////////THE ISSUE///////////////////
@Override
public T dequeue() {

    //Start of if
    if(isEmpty()) {
        System.out.println("Queue is empty");
    }//End of if

    //retrieve front than delete it
    T front = queue[frontIndex]; 
    queue[frontIndex] = null; 
    frontIndex = (frontIndex + 1) % queue.length; 
    return front;


}
    /////////////////THE ISSUE///////////////////

这也是我的toString方法

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    int temp = 0;
    sb.append("queue: ( ");
    if(queue.length == 0) {
        sb.append("empty queue");
    }
    while(queue[temp]!=null) {
        sb.append(queue[temp].toString());
        sb.append("--->");
        temp++;
    }
    sb.append(")");
    return sb.toString();
}

这是我的主类中的im测试方法

public static void testIntegers() {
    System.out.println("\n\nTesting with some integers");

    ArrayQueue<Integer> myIntegerQueue = new ArrayQueue<>();

    int testSet[] = { 1, 2, 3, 4, 5 };

    for (int i = 0; i < testSet.length; i++) {
        myIntegerQueue.enqueue(testSet[i]);
    }
    System.out.println(myIntegerQueue);

    for (int i = 0; i < testSet.length; i++) {
        System.out.println("Dequeue " + myIntegerQueue.getFront());
        myIntegerQueue.dequeue();
        // System.out.println("Dequeue " + myIntegerQueue.dequeue());
        System.out.println(myIntegerQueue);
    }

    // What happens if we try to dequeue from an empty queue?
    System.out.println("Dequeue " + myIntegerQueue.getFront());
    myIntegerQueue.dequeue();
    System.out.println(myIntegerQueue);
}

这是它显示的内容

  Testing with some integers
  queue: ( 1--->2--->3--->4--->5--->)
  Dequeue 1
  queue: ( )
  Dequeue 2
  queue: ( )
  Dequeue 3
  queue: ( )
  Dequeue 4
  queue: ( )
  Dequeue 5
  queue: ( )
  Queue is empty
  Dequeue null
  Queue is empty
  queue: ( )

第一次出队后的预期结果

队列:(2---

实际结果

队列: ( )

有人能告诉我或者指引我正确的方向,我做错了什么,因为我不知所措。提前感谢!

共有1个答案

宋典
2023-03-14

在<code>toString(),然后在while循环中,条件<code>while(队列[temp]!=null),这意味着该循环查看数组<code>队列的最开始,并检查它是否为<code>null,而不是由<code>frontIndex索引的第一个元素。第一次出列时,将数组中的第一个索引设置为null,这将导致toString()方法中的whileloop由于条件while(队列[temp]=null)而无法运行。不要设置temp=0,而是将其设置为temp=frontIndex这将按预期打印队列。

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    int temp = frontIndex;
    sb.append("queue: ( ");
    if(queue.length == 0) {
        sb.append("empty queue");
    }
    while(queue[temp]!=null) {
        sb.append(queue[temp].toString());
        sb.append("--->");
        temp++;
    }
    sb.append(")");
    return sb.toString();
}
 类似资料:
  • 我的取消排队方法目前也不会删除我想要的项,而是从集合中删除最后一个元素。例如 如果我添加元素:1,2,3我的toString方法将按预期返回1,2,3。 然后,当我使用我的驱动程序调用 dequeue 时,它应该取消第 0 个元素的排队,在本例中为 1。 尽管该方法表示“已从队列中删除元素1”,提示<code>T result 然后,当我再次调用enqueue方法时,在同一个队列上,如果我将字符串

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

  • 我正在尝试写入优先级队列。对于我的排队方法,我的逻辑是: 如果列表为空,则将事务添加到链接列表中的第一个节点 如果列表不为空,请将列表中事务对象的时间值与当前对象进行比较,如果对象的时间大于链表中的对象,则将对象插入当前索引。 否则,只需将它们添加到linkedlist的最后一个元素 我通过在方法中输入4个值来测试此方法,并相应地输入200020003000。 当我尝试从列表中除名时,它给我一个空

  • 我有一个用于队列的迭代器类(实现为循环数组)。我在下面附上代码。问题出在++运算符上。一旦它到达数组的末尾,它就会回到它的开始,因此迭代器会指向第一个元素。它工作得很好,但我没有办法使用这种方法实现then end()迭代器。在队列类中返回begin()和end()迭代器的函数可以在底部看到。end()迭代器应该指向队列的后部,但是当数组已满且后部等于数组的大小时,++运算符将循环返回,而不是让它

  • 到目前为止,这就是我的答案,但从逻辑上讲,我的答案对于findNextCity方法似乎是错误的。此外,我甚至不知道如何处理问题的第二部分(以下)。 我应该遍历cityQueue中的每个元素,使用下一种方法计算的欧几里德距离(distbetweencies),确定哪个元素最接近当前城市(从第一个参数)。我必须忽略已经标记在堆栈中或堆栈中的城市以及当前城市本身(否则,城市将始终是离自身最近的城市!)。

  • 我正在从Sahni的“C语言数据结构基础”中学习数据结构。在使用动态数组的循环队列中,作者提到了以下几点, 假设capacity是循环队列的初始容量,我们必须首先使用realloc增加数组的大小,这将把最大容量元素复制到新的数组中。为了获得正确的循环队列配置,我们必须将右段中的元素(即元素a和B)滑动到数组的右端(参见图3.7.d)。数组加倍和向右滑动一起最多复制2*容量-2个元素。