0

我在 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 也不起作用

4

5 回答 5

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)

于 2020-07-30T07:38:02.947 回答
1
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 个项目

于 2020-07-30T07:37:12.090 回答
1

使用 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)

于 2020-07-30T07:37:34.420 回答
1

问题是关于循环操作的副作用。当您检查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)

于 2020-07-30T07:37:38.693 回答
1

这是因为当您开始从入队数组中弹出项目时,计数会减少,在弹出 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)

于 2020-07-30T07:38:32.853 回答