Deque последний элемент вставки.

Datastructure Degue.

Метод для вставки значения впереди:

Отлично работает

 public void insertLeft(Item item) {       
       if (size == deque.length){
          resize(2 * deque.length);
      }
      deque[start] = item;
      start++;
      size++;
}

Метод для вставки значения в хвост - перезаписать последний элемент из-за этой строки //end = deque.length - 1;

public void insertRight(Item item) {
    if (size == deque.length){
        resize(2 * deque.length);
    }
    end = deque.length - 1;
    deque[end++] = item;
    end %= deque.length;
    size++;
}

Как я могу это исправить?

2 ответа

Решение

Скажем, массив имеет размер 10 и в настоящее время имеет 3 значения:

_ _ _ 1 2 3 _ _ _ _
      ^     ^
  start     end

Как видите, ваш insertLeft метод неверен:

  • Это заменит существующее значение
  • Он перемещает указатель в неправильном направлении
  • Это не обрабатывает обтекание

И ваш insertRight метод неверен:

  • Выбрасывает end значение

Переосмыслите то, что вы делаете, например, resize() метод обрабатывает условие, где массив обернут?

Пример:

3 4 5 _ _ _ _ _ 1 2
      ^         ^
    end         start

Если вы позвоните insertRight() 5 раз, вы получите:

3 4 5 X X X X X 1 2
                ^
                start
                end

6-й звонок insertRight() вызовет resize(), но правильно ли это с этим справиться? Например, в результате:

3 4 5 X X X X X Y _ _ _ _ _ _ _ _ _ 1 2
                  ^                 ^
                  end               start

deque.length - 1 возвращает индекс последней переменной. Вы должны пройти мимо этого:

deque[++end] = item;

Другие вопросы по тегам