JAVA如何在deque上实现环绕

时间:2018-02-16 17:20:46

标签: java queue deque

我试图在我的双端队列上实现环绕,由于某种原因我的insertRight()和removeRight()方法输出错误,我的removeLeft()方法只是抛出一个错误。我环顾四周,似乎无法找到答案,为什么我的方法在这里不起作用:

public void insertRight(int newItem) {
    if (isFull() == true) {
        System.out.print("Full");
    } // end of if
    else {
        if (right == capacity) {
            right = 0;
        } // end of nested if
        else {
            deque[right] = newItem;
            nElems++;
            right++;
        } // end of nested else
    } // end of else
}// end of insertRight

public void removeRight() {

    if (isEmpty() == true) {
        System.out.println("Empty");
    } // end of if
    if (isEmpty() == false) {
        System.out.println(right);
        if (right == capacity) {
            right = 0;
        } // end of nested if
        int temp = deque[right];
        right++;
        nElems--;
    } // end of if
}// end of removeRight

public void removeLeft() {
    if (isEmpty() == true) {
        System.out.println("Empty");
    } // end of if
    if (isEmpty() == false) {
        if (left == capacity) {
            left = -1;
        } // end of nested if
        else {
            System.out.println(left);
            int temp = deque[left];
            left++;
            nElems--;
        } // end of else
    } // end of if
}// end of removeLeft

2 个答案:

答案 0 :(得分:1)

有关leftright的实际含义/值的更多信息会有所帮助。

乍一看,看起来removeLeft()失败了,因为left的环绕点将为0,而不是capacity,如果到目前为止我对您的代码的理解是正确的。

此外,negative array indices do not work in java。你想直接引用实际的最后一个索引。

我真的建议调查代码格式。你的缩进很难说出一个块结束的位置和一个新的块开始。您可以通过遵循一致的缩进模式来保存自己的显式注释:

public void insertRight(int newItem) {
    if (isFull()) {
        System.out.print("Full");
    } else {
        if (right == capacity) {
            right = 0;
        } else {
            deque[right] = newItem;
            nElems++;
            right++;
        }
    }
}


public void removeRight() {

    if (isEmpty()) {
        System.out.println("Empty");
    } else {
        System.out.println(right);
        if (right == capacity) {
            right = 0;
        }
        int temp = deque[right];
        right++;
        nElems--;
    }
}


public void removeLeft() {
    if (isEmpty()) {
        System.out.println("Empty");
    } else {
        // My assumption inserted here:
        if (left == 0) {
            left = capacity - 1;
        } else {
            System.out.println(left);
            int temp = deque[left];
            left++;
            nElems--;
        }
    }
}

答案 1 :(得分:0)

我在这里看到了几个问题:

    if (right == capacity) {
        right = 0;
    } // end of nested if
    else {
        deque[right] = newItem;
        nElems++;
        right++;
    } // end of nested else

如果right == capacity您重置了索引但未将newItem插入数组。

它应该是这样的(直接键入,未测试):

    if (right == capacity) {
        right = 0;
    } // end of nested if
    deque[right] = newItem;
    nElems++;
    right++;

现在转到removeRight - 方法:

    System.out.println(right);
    if (right == capacity) {
        right = 0;
    } // end of nested if
    int temp = deque[right];
    right++;
    nElems--;

在这里,您使用相同的算法来检查边界,但它应该是"镜像"你在insertRight中使用的那个,所以像这样(直接输入,未测试):

    System.out.println(right);
    if (right == 0) {
        right = capacity;
    } // end of nested if
    int temp = deque[right - 1];
    right--;
    nElems--;

最后removeLeft

    if (left == capacity) {
        left = -1;
    } // end of nested if
    else {
        System.out.println(left);
        int temp = deque[left];
        left++;
        nElems--;
    } // end of else

如果没有insertLeft方法,我只能猜测它有类似的问题。