【问题标题】:JAVA how to implement wraparound on a dequeJAVA如何在双端队列上实现环绕
【发布时间】:2018-07-27 15:56:46
【问题描述】:

我试图在我的双端队列上实现环绕,由于某种原因,我的 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

【问题讨论】:

    标签: java queue deque


    【解决方案1】:

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

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

    另外,negative array indices do not work in java。您需要直接引用实际的最后一个索引。

    我真的建议研究代码格式。您的缩进使得很难分辨一个块在哪里结束和一个新块从哪里开始。您只需遵循一致的缩进模式即可为自己节省显式 cmets:

    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--;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

          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这个方法,我只能猜测它有类似的问题。

      【讨论】:

      • 我尝试了你的方法 Lothar,但我仍然遇到输出错误的问题,当我将 1、2、3 插入 insertLeft() 并尝试使用 removeRight() 删除所有三个输出时是 3 2 3。
      猜你喜欢
      • 2016-08-18
      • 2013-03-10
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2016-01-02
      • 2013-12-27
      • 2018-07-12
      相关资源
      最近更新 更多