剑指offer09

    解题思路:
    仔细想想,栈,后进先出;队列,先进先出。也就是说两者的进出顺序其实是反过来的。用栈实现队列,说白了就是用栈实现先进先出的效果,再说直接点,就是想办法让栈底的元素首先被取出。

    首先准备两个栈:
    171735fc8ee608ea.webp
    现在问题是,怎么把第一个栈底下的那个 1 给撬出来。仔细想想,阻碍我们接触到 1 的是啥?是不是它头上的 2 和 3?实际上咱们完全可以把这三个元素按顺序从 stack1 中出栈、然后入栈到 stack 2 里去:
    17173813ab3377b1.webp
    此时 1 变得触手可及。不仅如此,下一次我们试图出队 2 的时候,可以继续直接对 stack2 执行出栈操作——因为转移 2 和 3 的时候已经做过一次逆序了,此时 stack2 的出栈序列刚好就对应队列的出队序列。

    那如果 stack1 里入栈新元素怎么办?比如这样:
    171738289370743a.webp
    你会发现这个4按照顺序应该在 1、2、3 后出栈。当 4 需要被出栈时,stack2 一定已经空掉了。当 stack2 为空、而 stack1 不为空时,我们需要继续把 stack1 中的元素转移到 stack2 中去,然后再从 stack2 里取元素。也就是说,所有的出队操作都只能依赖 stack2 来完成——只要我们坚持这个原则,就可以确保 stack1 里的元素都能够按照正确的顺序(逆序)出栈。

    我们按照这个思路来写代码:

    1. var CQueue = function() {
    2. this.stack1 = [];
    3. this.stack2 = [];
    4. };
    5. /**
    6. * @param {number} value
    7. * @return {void}
    8. */
    9. CQueue.prototype.appendTail = function(value) {
    10. this.stack1.push(value)
    11. };
    12. /**
    13. * @return {number}
    14. */
    15. CQueue.prototype.deleteHead = function() {
    16. if(this.stack2.length<=0){
    17. while(this.stack1.length>0){
    18. this.stack2.push(this.stack1.pop());
    19. }
    20. }
    21. return this.stack2.pop() || -1;
    22. };