2

我有实现这个非常接近完成的代码,导致我的 IndexOutofBounds 错误的原因似乎是在插入队列的一种情况下发生的。有任何想法吗?在我的课程开始时,我将后部和前部设置为 -1,计数为 0。数组的最大大小为 100。有一个 isfull 类可以测试计数是否为最大大小。

    public boolean insert(int n){

    if (isFull()){
        //not inserted
        return false;
    }
    else{

       //make it the first in queue if queue is empty
       if ( front == -1 && rear == -1){
           front++;
           rear++;
           list[front] = n;
           list[rear] = n;
           count++;
           return true;

       }
       //not at end of queue, add to end
        else if ( (count+1) <= 100 ){
            rear++;
            list[rear] = n;
            count++;
            return true;
        }
        //else add to front
        else{
            //update rear
            rear = ((count+1)%100)-1;
            list[rear] = n;
            return true;
        }
    }
}   

到目前为止,此代码按以下顺序将一个数字插入到数组中:0。检查它是否已满。如果是退出。1. 如果队列为空,则将其设为其中的第一项。2.如果队列不为空或不满,检查数组后面是否没有超过最大点数。如果没有,请将其添加到末尾。3.如果队列不是空的或满的,但是队列的后面是满的。循环并将其插入数组的开头。

问题是在以下情况下: - 数组填充有数字 1-100。此时阵列已满。- 移除前面,因此阵列从 2-100 变为第一个插槽为空。- 插入刚刚删除的号码,这会导致错误。此时 count+1 没有超过最大点数,因此它尝试将其添加到后面。但是由于最后一个位置已满,它不会循环,抛出一个数组越界异常。我可以添加什么来检查最后一个位置是否已填充并在这种情况下添加到数组的开头?

我的删除方法:

    public int remove(){
    //if empty return -1
    if (isEmpty()){
        return -1;
    }
    else{//else remove
        front++;
        int x = list[front-1];
        count--;
        return x;
    }
   }
4

1 回答 1

0
public boolean insert(int n){

    if (isFull()){
        //not inserted
        return false;
    }
    else{

       //make it the first in queue if queue is empty
       if (isEmpty()){ //use empty
           front=0;//just set it 
           rear=0;//just set it 
       }
       list[rear] = n;
       rear = (rear+1)%100; //just rewind it when it reaches 100 index 0 must be free at this point

       count++;
       return true;
    }

}

我想count是元素的数量,所以 remove 应该这样做count--。在这种情况下,计数始终<100,因为在您检查后数组未满......所以您唯一要做的就是倒回后计数器;

另外删除应该做front = (front+1)%100;

public int remove(){
    if (isEmpty()){
        return -1;
    }
    else{//else remove

        int x = list[front];//reorder
        front = (front+1)%100;//rewind
        count--;
        return x;
    }
}

empty()并且full()应该使用计数

front指向remove()下一个元素

last总是指向下一个空闲点(或者front下一个空闲点也是)

于 2013-10-24T22:50:58.023 回答