算法分享第6题

题目:用两个栈实现一个队列,只要求实现入队,出队方法即可.
假设这两个栈分别为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 {

    private Stack s1 = new Stack<>();
    private Stack 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题)