Почему моя структура данных очереди в javascript ведет себя так, как не должна - PullRequest
1 голос
/ 05 мая 2020

Я реализовал очередь, используя связанный список. Я добавил функцию постановки в очередь и удаления из очереди. Согласно структуре данных, если после использования удаления из очереди, элемент после «переднего» элемента должен стать передним, но мой код устанавливает третий элемент в очереди как передний. Пожалуйста, посмотрите мой код и скажите, что я сделал не так.

class Node {
  constructor(value) {
    this.value = value;
    this.prev = null;
  }
}
class Queue {
  constructor() {
    this.front = null;
    this.rear = null;
    this.length = 0;
  }
  enqueue(value) {
    const newNode = new Node(value);
    if (this.length === 0) {
      this.front = newNode;
      this.rear = newNode;
    } else {
      this.front.prev = this.rear;
      this.rear = newNode;
    }
    this.length++;
    
    return newNode;
  }
  dequeue() {
    if (!this.front) {
      return null;
    }
    if (this.front === this.rear) {
      this.rear = null;
    } else {
      this.front = this.front.prev;
      this.length--;
    }
    return this.front;
  }
}

const myQueue = new Queue();

console.log('myQueue.enqueue(5) : ', myQueue.enqueue(5));
console.log('myQueue : ', myQueue);

console.log('myQueue.enqueue(6) : ', myQueue.enqueue(6));
console.log('myQueue : ', myQueue);

console.log('myQueue.enqueue(7) : ', myQueue.enqueue(7));
console.log('myQueue : ', myQueue);

console.log('myQueue.dequeue() : ', myQueue.dequeue());
console.log('myQueue : ', myQueue);

console.log('myQueue.dequeue() : ', myQueue.dequeue());
console.log('myQueue : ', myQueue);
.as-console-wrapper { max-height: 100%!important; top: 0; }

1 Ответ

0 голосов
/ 05 мая 2020

Есть две части ответа ...

  1. исходный первый ответ,
  2. и второй обновленный ответ, который касается связанного списка OP.

1-й ответ

Произошла ошибка приращения this.length- вместо this.length--;.

А как насчет использования подхода Queue, который инкапсулирует структуру списка, например Array? ..

class Node {
  constructor(value) {
    this.value = value;
    this.prev = null;
  }
}

class Queue {
  constructor() {

    const queue = [];

    this.front = null;
    this.rear = null;
    this.length = queue.length;

    Object.defineProperty(this, 'enqueue', {
      value: function (value) {

        const node = new Node(value);
        const itemCount = queue.push(node);

        node.prev = queue[itemCount - 2] || null;

        this.front = queue[0];
        this.rear = queue[itemCount - 1];
        this.length = itemCount;

        return node;
      }
    });
    Object.defineProperty(this, 'dequeue', {
      value: function () {

        const node = queue.shift() || null;
        const itemCount = queue.length;

        this.front = queue[0] || null;
        this.rear = queue[itemCount - 1] || null;
        this.length = itemCount;

        return node;
      }
    });
  }
}

const queue = new Queue();

console.log('queue.enqueue(5) : ', queue.enqueue(5));
console.log('queue.enqueue(6) : ', queue.enqueue(6));
console.log('queue.enqueue(7) : ', queue.enqueue(7));

console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue.dequeue() : ', queue.dequeue());

console.log(queue);
.as-console-wrapper { max-height: 100%!important; top: 0; }

2-я итерация с подходом связанного списка

Правильный процесс удаления из очереди зависит, скорее, от правильно обслуживаемых ссылок next. Ссылка prev - это просто хорошо иметь функцию сверху ... доказательство концепции ...

class Node {
  constructor(value) {
    this.value = value;
    this.prev = null;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.front = null;
    this.rear = null;
    this.length = 0;
  }
  enqueue(value) {
    const enqueuedNode = new Node(value);

    if (this.rear !== null) {
      this.rear.next = enqueuedNode;
    }
    enqueuedNode.prev = this.rear;

    const itemCount = ++this.length;
    if (itemCount === 1) {

      this.front = enqueuedNode;
    }
    this.rear = enqueuedNode;

    return enqueuedNode;
  }
  dequeue() {
    const dequeuedNode = this.front;
    if (dequeuedNode !== null) {

      dequeuedNode.prev = null;
      // dequeuedNode.next = null;
    }
    this.front = dequeuedNode && dequeuedNode.next;

    const itemCount = --this.length;
    if (itemCount === 0) {

      this.rear = null;

    } else if (itemCount <= -1) {

      this.length = 0;
    }
    return dequeuedNode;
  }
}

const queue = new Queue();

console.log('queue.enqueue(5) : ', queue.enqueue(5));
console.log('queue : ', queue);

console.log('queue.enqueue(6) : ', queue.enqueue(6));
console.log('queue : ', queue);

console.log('queue.enqueue(7) : ', queue.enqueue(7));
console.log('queue : ', queue);

console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue : ', queue);

console.log('queue.dequeue() : ', queue.dequeue());
console.log('queue : ', queue);
.as-console-wrapper { max-height: 100%!important; top: 0; }
...