数据结构【栈】(十):使用栈实现队列

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010647035/article/details/88776574

问题描述

使用两个栈模拟队列,比如输入:1 2 3 4,则要求输出仍是:1 2 3 4

解题思路

1、有两个栈,一个用来存放入队数据(数据栈),一个用来辅助(辅助栈)实现数据出队。

2、数据添加时,会依次压人栈,取数据时会取栈顶元素,但要模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,保留最后一个元素,数据栈就直接把元素弹出,这时数据栈就已经空了。

3、辅助栈的元素依次压人数据栈,这样我们就成功取到了栈底元素。

代码实现

public class Stack2Queue {
    /**
     * 用栈的入栈和出栈
     * 来实现队列的入队和出队
     * stack1是入栈的,stack2是出栈的。
     * 入队列:直接压入stack1即可
     * 出队列:如果stack2不为空,把stack2中的栈顶元素直接弹出;
     * 否则,把stack1的所有元素全部弹出压入stack2中,再弹出stack2的栈顶元素
     */
    Stack stack1 = new Stack();
    Stack stack2 = new Stack();

    public void add(Object o) {
        stack1.push(o);
    }

    public Object poll() {
        Object o = null;

        if (stack2.size()== 0) {
            //把stack1的数据放入stack2,留下最后一个数据
            while (stack1.size() > 1) {
                stack2.push(stack1.pop());
            }
            if (stack1.size() == 1) {
                //把stack1的留下的那个数据返回出去
                o = stack1.pop();
            }
        } else {
            o = stack2.pop();
        }

        return o;
    }

    public int length() {
        return stack1.size() + stack2.size();
    }

    public static void main(String[] args) {
        /**
         * 用两个栈实现队列
         * */
        Stack2Queue stack2Queue = new Stack2Queue();
        stack2Queue.add("a");
        stack2Queue.add("b");
        stack2Queue.add("c");
        stack2Queue.add("d");
        stack2Queue.add("e");
        while(stack2Queue.length()>0) {
            System.out.println(stack2Queue.poll());
        }
    }

}

猜你喜欢

转载自blog.csdn.net/u010647035/article/details/88776574