(剑指offer) 用两个栈来实现一个队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:由于栈是后进先出,所以先依次进入栈1,再从栈1依次弹出到栈2,这样栈1和栈2元素的顺序就正好相反了,然后弹出栈2顶部的元素,就完成了一个先进先出的过程。

维护两个栈 stack1 和 stack2,其中 stack1 用于存储元素,stack2 用于辅助操作。当栈2不为空时,在栈2顶部的元素是最先进入队列的元素,可以弹出,当栈2为空时把栈1中的元素逐个压入栈2中。

var Stack1 = []
var Stack2 = []
function push(node)
{
    // write code here
    Stack1.push(node)
    

}
function pop()
{
    // write code here
    //判断为空的情况
    if (Stack1.length ==0 && Stack2.length == 0) {
        return false
    }
    if (Stack2.length == 0) {
        while(Stack1.length !==0) {
            Stack2.push(Stack1.pop())
        }
    }
    return Stack2.pop()
}

拓展——用两个队列实现一个栈的pop和push操作

var queue1 = []
var queue2 = []
function push (node) {
    //推入的时候要判断哪个队列中有值,就推入那个队列中
    if(queue1.length !== 0) {
        queue1.push(node)
    }else {
        queue2.push(node)
    }
}
//假设栈现在有三个元素a,b,c,我们现在要删除c
function pop () {
    //弹出的时候判断哪个队列中有值,则先将该队列中的n-1个值弹出并存入另一个队列中,然后弹出最后一个值则为结果
    if(queue1.length === 0) {
        while(queue2.length !== 1) {
            queue1.push(queue2.pop()) //依次从queue2中删除元素a,b并且加入到queue1中
        }
        return queue2.pop() //最后再删除
    }else {
        while(queue1.length !== 1) {
            queue2.push(queue1.pop())
        }
        return queue1.pop()
    }
}
不积跬步无以至千里
原文地址:https://www.cnblogs.com/lyt0207/p/12512645.html