java基础编程——用两个栈来实现一个队列

题目描述

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

题目代码

/**
 *  <分析>:
 *  入队:将元素进栈A
 *  出队:判断栈B是否为空,
 *  如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;
 *  如果不为空,栈B直接出栈。
 * Created by YuKai Fan on 2018/8/20.
 */
public class TwoStackToAchieveQueue {
    Stack<Integer> stack1 = new Stack<>();
    Stack<Integer> stack2 = new Stack<>();

    public static void main(String[] args) {
        TwoStackToAchieveQueue twtaq = new TwoStackToAchieveQueue();
        twtaq.push(1);
        twtaq.push(2);
        twtaq.push(3);
        System.out.println(twtaq.pop());
        System.out.println(twtaq.pop());
        twtaq.push(4);
        System.out.println(twtaq.pop());
        System.out.println(twtaq.pop());
        twtaq.push(5);
        System.out.println(twtaq.pop());

    }
    /*
    push方法,直接将值push到stack1中
     */
    public void push(int node) {
            stack1.push(node);
    }

    /*
    pop方法,先判断stack2是否为空,
    如果不为空的话,直接返回stack2的栈顶,
    如果为空,就将stack1中的元素,压入stack2中,然后返回弹出stack2的元素

    为什么要判断是否为空,这里用main方法中的数据来解释?
    当向stack1中压入三个数时,此时stack1中的数据结构为
    |3|
    |2|
    |1|
    之后执行两次pop操作,因为stack2为空,所以将stack1中的值压入stack2中。此时stack1中的元素为空,stack2的数据结构为:
    |1|
    |2|
    |3|
    执行两次结束后返回stack2中的栈顶元素,所以打印出来1,2。此时stack2的数据结构为:
    |3|
    再往下执行push(4),此时stack1中的数据结构为:
    |4|
    在执行一次pop,但是此时stack2是不为空的,如果不加入判断,就会将4压入栈顶,在pop的话,出来的就是4而不是3,所以需要判断stack2是否为空,如果不为空就直接弹出栈顶元素
    所以此时应该打印3
    接下来有执行一次pop,此时stack2由于上一次的pop操作,此时为空,所以将stack1中的4弹出并压入stack2,然后在弹出stack2的元素,所以此时打印4
    最后的两次操作也是同样的道理
     */
    public int pop() {
        if (stack1.empty() && stack2.empty()) {
            throw new RuntimeException("Queue is empty!");
        }
        if (stack2.empty()) {
            int l = stack1.size();
            for (int i = 0; i < l; i++) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

题目延伸

用两个队列实现一个栈的功能?要求给出算法和思路!

/**
 * 将queue1用作进栈出栈,queue2作为一个中转站
 * 入栈时,直接压入queue1中出栈时,先将queue1中的元素除最后一个元素外依次出队列,并压入队列queue2中,
 * 将留在queue1中的最后一个元素出队列即为出栈元素,最后还要把queue2中的元素再次压入queue1中
 *
 * Created by YuKai Fan on 2018/8/20.
 */
public class TwoQueueToStack {
    LinkedList<Integer> queue1 = new LinkedList<>();
    LinkedList<Integer> queue2 = new LinkedList<>();

    public static void main(String[] args) throws Exception {
        TwoQueueToStack tqts = new TwoQueueToStack();
        tqts.push(1);
        tqts.push(2);
        tqts.push(3);
        tqts.push(4);
        tqts.push(5);
        System.out.println(tqts.pop());
        System.out.println(tqts.pop());
        System.out.println(tqts.pop());
        System.out.println(tqts.pop());
        System.out.println(tqts.pop());
    }

    public void push(int node) {
        queue1.addLast(node);
    }

    public int pop() throws Exception {
        if (queue1.isEmpty() && queue2.isEmpty()) {
            throw new Exception("queue is empty");
        }
        if (queue1.size() == 1) {
            return queue1.poll();
        } else {
            //如果在出列queue1最后一个元素时,又在queue1入列元素就会,发生元素顺序错乱
            while (queue1.size() != 1) {
                queue2.add(queue1.poll());
            }
            int m = queue1.poll();
            while (!queue2.isEmpty()) {
                queue1.add(queue2.poll());
            }
            return m;
        }
    }

}

 

 

posted @ 2018-08-20 15:59  MichaelKai  阅读(446)  评论(0编辑  收藏  举报