Может ли кто-нибудь быстро дать мой код для deque, пожалуйста? - PullRequest
0 голосов
/ 08 февраля 2011

Я уже некоторое время работаю над этим, и я думаю, что, наконец, взломал его, он работает для всех моих тестов, но у меня есть ощущение, что возникнут некоторые проблемы. Это сильно упрощенная версия двусторонней очереди (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 ]

3 голосов
/ 08 февраля 2011

Несколько комментариев:

  • Я бы использовал T или E в качестве имени параметра типа, а не EltType
  • Я бы переименовал константу CAPACITY в DEFAULT_CAPACITY и сделал бы ее статической.
  • first() вернет значение, даже если очередь логически пуста
  • last(), removeLast() и removeFirst() должны выдать соответствующее исключение, если end равно 0
  • Нет смысла выделять емкость отдельно от размера, если только вы не используете ее, чтобы не создавать новый массив каждый раз. Если вы всегда собираетесь расширять / уменьшать массив при любых изменениях, просто используйте массив самостоятельно - вы можете определить размер только по длине массива
  • В removeFirst и removeLast ваш цикл равен capacity вместо end
  • Используйте System.arraycopy как более простой способ копирования массивов
  • У вас нет назначения на deque в insertLast - отсюда и исключение, которое вы видите в комментариях.

Я не уверен, что вижу преимущество в этом по сравнению с простым использованием ArrayList<T>, хотя ... основной смысл отдельной реализации Deque состоит в том, чтобы добавить к обеим головкам и Хвост дешевый ... у нас нет ни того, ни другого!

... или, конечно, просто используйте ArrayDeque или LinkedList:)

0 голосов
/ 08 февраля 2011

Я бы предложил

  • не создавайте новый объект [] каждый раз, когда добавляете или удаляете запись.
  • Используйте System.arrayCopy () вместо ручного копирования.
  • Вам не нужно копировать до емкости, только до конца.
  • Вы можете использовать кольцевой буфер, чтобы избежать необходимости перемещать элементы (нет необходимости в копиях)
  • Удаление На основе имени ArrayDeque более соответствует ArrayList, ArrayBlockingQueue и т. Д.
...