美文网首页
算法分享第6题

算法分享第6题

作者: DevWang | 来源:发表于2017-12-24 21:29 被阅读0次
    题目:用两个栈实现一个队列,只要求实现入队,出队方法即可.
    假设这两个栈分别为s1,s2




















    • 分析思路
      1、栈的特性为:先进后出;队列的特性为:先进先出;
      2、如一个数组 data[0] ~ data[n - 1] ,我们将它压入s1栈中,那么 data[0]在栈底,data[n - 1]在栈顶;
      3、如果我们对s1栈中的元素执行出栈操作,并将出栈元素压入s2栈中,那么在s2栈中data[n - 1]在栈底,data[0]在栈顶;
      4、此时s2栈中的元素再次出栈的话,顺序即是:按照 data[0] ~ data[n - 1] 的顺序进行出栈,这就和队列先进先出的顺序相吻合.
    • 实现思路1
      1、把s1作为存储空间,s2作为临时空间;
      2、入栈时:把元素压入s1;
      3、出栈时:把s1中除栈底元素外的所有元素都倒入s2,弹出s1的栈底元素,然后把s2中所有元素倒回s1.
    • 实现思路2
      1、把s1作为存储空间,s2作为临时空间;
      2、入栈时,判断s1是否为空:
      如不为空,说明所有元素都在s1,直接将入栈元素压入s1;
      如为空,将s2中的所有元素倒回s1,再将入栈元素压入s1;
      3、出栈时,判断s2是否为空:
      如不为空,直接弹出s2的栈顶元素并出栈;
      如为空,把s1中除栈底元素外的所有元素都倒入s2,然后弹出s1的栈底元素.
    • 实现思路3 - 最佳方案
      1、把s1作为存储空间,s2作为临时空间:
      2、入栈时,将元素压入s1;
      3、出栈时,判断s2是否为空:
      如不为空,则直接弹出顶元素;
      如为空,把s1中除栈底元素外的所有元素都倒入s2,然后弹出s1的栈底元素.

    最佳方案实现代码:

    class Stack4Queue<E> {
    
        private Stack<E> s1 = new Stack<>();
        private Stack<E> s2 = new Stack<>();
    
        // 入队列
        public void push(E item) {
            s1.push(item);
        }
    
        // 出队列
        public E pop() {
            if (s2.empty()) {
                if (s1.empty()) {
                    return null;
                }
                while (s1.size() != 1) {
                    s2.push(s1.pop());
                }
                return s1.pop();
            }
            return s2.pop();
        }
    }

    相关文章

      网友评论

          本文标题:算法分享第6题

          本文链接:https://www.haomeiwen.com/subject/ikzhgxtx.html