当前位置: 首页 > 知识库问答 >
问题:

为什么我在javascript中的队列数据结构的行为不应该如此

魏成济
2023-03-14
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个答案

闻人修明
2023-03-14

有两个答案部分...

  1. 最初的第一个答案,
  2. 和处理OP链接列表的第二个更新答案。

this.length-而不是this.length--;存在增量错误。

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; }
 类似资料:
  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?

  • 像这样的正常队列: _empty1__empty2__empty3__empty4_... 所以这里的“front”指向“empty1”。但是, (*1):我的第三项质询与第二项质询相同,但以通函方式提出。

  • 将在文件中说明的任何时候安装,但是将更新所有的依赖关系,并根据是什么创建一个新的文件需要在。 所以很多人说只在开发中运行。但是我的问题是做确实替换了旧的文件,如果你的应用程序要中断,它将中断,因为可能与新更新的依赖项冲突。 我遇到了一种情况,我必须执行,这个问题与扩展有关。唯一的解决方案是进行PHP-pcntl模块安装 我不明白为什么人们害怕在生产中运行。

  • 问题内容: 我一直在寻找为什么不应该在类的构造函数中调用线程的start方法的理由。考虑以下代码: ImportantData是一些通用的东西(可能很重要),而MyOperationThread是知道如何处理SomeClass实例的线程的子类。 脚节点: 我完全理解为什么这是不安全的。如果MyOperationThread在以下语句完成(并且数据已初始化)之前尝试访问SomeClass.data,

  • 我正在编写一个创建序列并保存它们的Java程序。我正在寻找最合适的数据结构来保存序列。我事先不知道序列的长度,也不知道我会有多少个序列,序列可以有不同的长度。 我应该使用什么结构?

  • 问题内容: 为什么不应该使用函数的技术原因是什么?(例如,或)? 为什么我要使用其他东西,即使它们在我的网站上工作? 如果它们在我的网站上不起作用,为什么我会收到类似的错误 警告:mysql_connect():没有那个文件或目录 问题答案: MySQL 扩展: 未在积极开发中 被正式弃用的PHP 5.5(发布2013年6月)。 自 PHP 7.0起 已完全删除 (2015 年 12 月发布) 这