有人可以快速给我一个deque的代码吗?

时间:2011-02-08 19:22:40

标签: java deque

现在已经有一段时间了,我想我终于破解了它,它适用于我所有的测试,但我觉得会有一些琐碎的问题。这是双面队列(deque)的大量简化版本,每次添加值时,都会生成一个临时数组来存储所有值,然后附加新值。我相信这是最容易解释的方式。如果有人可以请你仔细检查我是对的,这里没有什么明显的错误,我会非常感激。非常感谢你们! :)

    public class ArrayBasedDeque<EltType> implements Deque<EltType> {

  private final int CAPACITY = 10;
  private int capacity;
  private int end;
  private EltType deque[];  

  public ArrayBasedDeque() {
    this.capacity = CAPACITY;
    deque = (EltType[]) (new Object[capacity]);  
  }
  public EltType first() {
    return  deque[0];
  }
  public EltType last() {
    return deque[end-1];
  }

  public boolean isEmpty() {
    return end == 0;
  }

  public int size() {
   return deque.length;
  }

  public boolean isFull() {
   return end == capacity;
  }
  public void insertFirst(EltType inserted) {
    if (!isEmpty()) {
    EltType[] tempArray;
    capacity+=1;
    tempArray = (EltType[]) new Object[capacity];
    for(int i=0;i<end;i++){
    tempArray[i+1] = deque[i]; 
    }
    deque=tempArray;
    }
    deque[0] = inserted;
    end++;
    }

  public void insertLast(EltType last) {
    if (isFull()){
          EltType[] tempArray;
          capacity+=1;
      tempArray = (EltType[]) new Object[capacity];
      for (int i=0;i<end;i++) {
        tempArray[i] = deque[i]; 
      }
//      System.out.print(deque[end]);
    }
    deque[end] = last;   
    end++;
  }

  public EltType removeFirst() {
    EltType[] tempArray;
    EltType returned = deque[0];
    tempArray = (EltType[]) new Object[capacity];
      for (int i=1;i<capacity;i++) {
        tempArray[i-1] = deque[i]; 
      }
      deque = tempArray;
      end--;
    return returned;
  }

  public EltType removeLast() {
    EltType[] tempArray;
    EltType returned = deque[end-1];

    tempArray = (EltType[]) new Object[capacity];
      for (int i=0;i<capacity;i++) {
        tempArray[i] = deque[i]; 
      }
      deque = tempArray;
      end--;
    return returned;
  }




}

2 个答案:

答案 0 :(得分:3)

一些评论:

  • 我会使用TE作为类型参数的名称,而不是EltType
  • 我将常量CAPACITY重命名为DEFAULT_CAPACITY,并将其设为静态。
  • 即使deque在逻辑上为空,
  • first()也会返回一个值
  • 如果last()为0,
  • removeLast()removeFirst()end应该抛出适当的例外
  • 将容量与大小分开是没有意义的,除非您每次都使用它来避免创建新数组。如果您总是要在任何更改时扩展/缩小数组,只需单独使用该数组 - 您可以从数组的长度来判断大小
  • removeFirstremoveLast中,您的循环边界为capacity而不是end
  • 使用System.arraycopy作为复制数组的简单方法
  • 您尚未在deque中找到insertLast的作业 - 因此您在评论中看到的例外情况。

我不确定我是否认为仅仅使用ArrayList<T>就可以获益...但是,单独Deque实施的主要目的是为两个头部添加拖尾便宜......这里我们都没有!

...当然只需使用ArrayDequeLinkedList:)

答案 1 :(得分:0)

我建议

  • 每次添加或删除条目时都不要创建新的Object []。
  • 使用System.arrayCopy()而不是手动复制。
  • 您不需要复制到容量,只能到最后。
  • 你可以使用环形缓冲区以避免需要移动元素(不需要复制)
  • Drop基于名称ArrayDeque与ArrayList,ArrayBlockingQueue等更加一致。