【问题标题】:Not able to push all elements of a stack into another stack using for loop in JavaScript [duplicate]无法使用 JavaScript 中的 for 循环将堆栈的所有元素推入另一个堆栈 [重复]
【发布时间】:2020-11-19 21:50:00
【问题描述】:

我在 HackerRank 上练习数据结构,我遇到了一个问题,说要使用两个堆栈实现一个队列,所以我查找它并理解了非常简单的逻辑 好像 : 使两个堆栈入队和出队 : 用于入队操作推送入队堆栈中的元素 :对于出队操作-首先检查出队堆栈是否为空,如果为空则从入队堆栈中弹出所有元素并将它们推入出队堆栈,以便入队完全反转,现在我们可以从出队堆栈中弹出顶部到执行出队操作(返回队列的最前面) :并且如果出队堆栈不为空,那么只需从队列前面的同一个 stcak 中弹出。 下面是一个 for 循环示例,它传输 Enqueue 堆栈的所有内容并使用 push 和 pop 操作将它们放入 Dequeue 堆栈,但 for 循环的行为很奇怪

let enqueueStack  = [1,2,3,4,5,6]
let dequeueStack = [];
for(let i=0;i<enqueueStack.length;i++){
    dequeueStack.push(enqueueStack.pop())
}
console.log(enqueueStack)
console.log(dequeueStack

下面是输出

[ 1, 2, 3 ]
[ 6, 5, 4 ]

我试过 forEach 也没有用

【问题讨论】:

  • 提示:enqueueStack.pop() 使 enqueueStack.length 下降。

标签: javascript arrays for-loop foreach stack


【解决方案1】:

这是因为当您开始从 enqueue 数组中弹出项目时,计数会减少,在弹出 3 个项目(即 6、5、4)后,enqueueStack 长度为 3,i 的值也是如此。因此它在 3 个元素处停止。

let enqueueStack  = [1,2,3,4,5,6]
let dequeueStack = [];
let arrayLength = enqueueStack.length
for(let i=0;i<arrayLength;i++){
    dequeueStack.push(enqueueStack.pop()) // use this to add items in reverse order
//dequeueStack.push(enqueueStack.shift()) add items in the same order 
}
console.log(enqueueStack)
console.log(dequeueStack)

【讨论】:

    【解决方案2】:

    while 循环的完美示例!随着弹出元素时 enqueueStack 的长度发生变化。但是你并不真正关心 enqueueStack 是否有更多元素的长度。

    let enqueueStack  = [1,2,3,4,5,6]
    let dequeueStack = [];
    while(enqueueStack.length){
        dequeueStack.push(enqueueStack.pop())
    }
    console.log(enqueueStack)
    console.log(dequeueStack)

    【讨论】:

      【解决方案3】:

      问题在于循环操作的副作用。当您检查enqueueStack.length 时,它会根据您所做的pop() 操作发生变化。 您可以通过记录长度值来注意到:

      let enqueueStack  = [1,2,3,4,5,6]
      let dequeueStack = [];
      for(let i=0;i<enqueueStack.length;i++){
          console.log(`length: ${enqueueStack.length}, i: ${i}`);
          dequeueStack.push(enqueueStack.pop())
      }

      如果不改变方法,正确的解决方案将是:

      let enqueueStack  = [1,2,3,4,5,6]
      let dequeueStack = [];
      for(let i=0, l=enqueueStack.length;i<l;i++){
          dequeueStack.push(enqueueStack.pop())
      }
      console.log(enqueueStack)
      console.log(dequeueStack)

      【讨论】:

        【解决方案4】:

        使用 pop 函数可以减少 enqueueStack 的长度,因此不要在每次比较时都查询长度,而应该立即分配它并向后迭代

        let enqueueStack  = [1,2,3,4,5,6]
        let dequeueStack = [];
        for(let i=enqueueStack.length-1; i>=0; i--){
            dequeueStack.push(enqueueStack.pop())
        }
        console.log(enqueueStack)
        console.log(dequeueStack)

        或者只是检查是否有剩余物品,而不是与 i 进行比较

        let enqueueStack  = [1,2,3,4,5,6]
        let dequeueStack = [];
        while(enqueueStack.length)
            dequeueStack.push(enqueueStack.pop())
        console.log(enqueueStack)
        console.log(dequeueStack)

        【讨论】:

          【解决方案5】:
          while(enqueueStack.length > 0) {
              dequeueStack.push(enqueueStack.pop())
          }
          

          var elementNumber = enqueueStack.length;
          for(let i=0;i<elementNumberi++){
              dequeueStack.push(enqueueStack.pop())
          }
          

          Array.pop() 从数组中删除 1 个元素,使其长度减小。当 i = 3 时,enqueueStack 的长度为 3 (6 - 3),因为您删除了 3 个项目

          【讨论】:

            猜你喜欢
            • 2013-12-26
            • 2019-04-26
            • 2019-06-13
            • 2021-07-27
            • 2017-03-22
            • 2021-07-19
            • 1970-01-01
            • 2012-02-15
            • 2020-05-27
            相关资源
            最近更新 更多