我正在学习算法和DS。 如何在JavaScript中使用队列?

我知道您可以做这样的事情。

var stack = [];
stack.push(2);       // stack is now [2]
stack.push(5);       // stack is now [2, 5]
var i = stack.pop(); // stack is now [2]
alert(i);            // displays 5

var queue = [];
queue.push(2);         // queue is now [2]
queue.push(5);         // queue is now [2, 5]
var i = queue.shift(); // queue is now [5]
alert(i);              // displays 2

但是shift()不会移动所有内容,因此,时间复杂度为O(N),而不是Java中的出队为O(1)

为什么JavaScript本身不具有像Stack(array)这样的Queue概念?

我只是好奇而已。 请赐教。

(我问自己这个问题,但找不到有效的理由说明为什么ES8或ES9无需使用自己的队列就可以使用Dequeue O(1)内置队列并加入O(1)队列)

PS:对不起,我想问一个愚蠢的问题,但这一直困扰着我!

#1楼 票数:2

您可以在香草JS中从头实现。 至于为什么它不是本机的,可能是因为几乎没有必要提高效率,并且数组/对象足够灵活以使用。

function Queue() {
    this._oldestIndex = 1;
    this._newestIndex = 1;
    this._storage = {};
}

Queue.prototype.size = function() {
    return this._newestIndex - this._oldestIndex;
};

Queue.prototype.enqueue = function(data) {
    this._storage[this._newestIndex] = data;
    this._newestIndex++;
};

Queue.prototype.dequeue = function() {
    var oldestIndex = this._oldestIndex,
        newestIndex = this._newestIndex,
        deletedData;

    if (oldestIndex !== newestIndex) {
        deletedData = this._storage[oldestIndex];
        delete this._storage[oldestIndex];
        this._oldestIndex++;

        return deletedData;
    }
};

  ask by TechnoCorner translate from so

未解决问题?本站智能推荐:

1回复

使用原生Promise的异步事件队列

我正在尝试构建类似于此的“事件”队列: https : //stackoverflow.com/a/24932757/6385482 但不使用任何库(例如 jQuery、Bluebird、Q) 示例:我有一个数组 ...并且我想实现名为“each”的函数,它会调用“event”并按顺序调用异步函数
1回复

用Javascript创建队列

我正在用javascript写一个队列,并且不确定实现它的最佳方法是什么: 选项1: 做类似... ...并使用推入/移入功能排入/出队。 选项2: 创建一个像这样的对象: 选项3: 您还有其他建议吗? 我看到的使用选项2而不是1的唯一好处是,如果我想创建一个唯一
1回复

编写Javascript队列

在这个问题中,我被要求编写一个函数nextInLine,该函数以数组(arr)和数字(item)作为参数。 将数字添加到数组的末尾,然后删除数组的第一个元素。 然后,nextInLine函数应返回已删除的元素。 这是代码段: 如何使此代码起作用? 提前致谢!
3回复

Javascript函数队列

我正在用Javascript和JQuery编写应用程序,我需要按照顺序调用函数,因此我考虑使用队列。 我已经看到了 ,但是(如果可能的话)我更喜欢抽象或避免在函数调用中使用function(next),如下例所示,因为我有很多自定义函数: 有可能还是有其他选择,我不知道呢?
1回复

JavaScript堆栈,队列和事件循环?

我正在尝试验证以下代码的发生顺序。 setTimeout()从堆栈中弹出,然后anonymous()进入队列。 当setTimeout()在堆栈上时,anonymous()进入队列,然后setTimeout()从堆栈中弹出。 以上哪个是正确的顺序? 我在此链接上进行了尝试,我注
2回复

如何使用Javascript对象/地图作为队列

现在我有一个队列(JS 数组)用于存储等待游戏的玩家。 我需要队列的 FIFO 属性,以便首先添加到队列的玩家首先进入新游戏。 队列的问题在于它没有恒定的时间查找。 如果我能有一个记录插入顺序的地图,那就太好了(我知道依靠地图来做到这一点是 JS 不可靠的)。 如果我给属性一个插入顺序的值,如果有人
1回复

如何构建JavaScript回调队列并执行具有最终回调的队列

我正在用javascript做一些动画或类似卡通的事情。 动画具有一些脚本,这些脚本按顺序执行一些指令,例如在画布上绘画事物和播放声音。 有些脚本必须执行多次。 因此,要执行脚本0、1、2、3、4(3次),然后执行5,以制作完整的动画序列。 我的代码如下所示: TTMPlayer加载
1回复

在javascript中创建队列的最佳方法是什么?

我知道 javascript 有 push/shift/pop 属性可以帮助创建这种类型的数据结构。 但我明白在巨量数据上使用它们并不是一个好主意,因为它必须遍历整个数组才能执行操作。 那么.. 一个高效代码的例子会是什么样子? 这是我的代码,但是在删除元素时使用“dequeue”时,即使它的值为“