9.使用两个栈来实现队列

使用两个栈来实现队列

一:题目描述

使用两个栈来完成一个队列,实现队列的push操作与pop操作

二:题目解析

1):栈的特性
栈是先进后出,对数据的操作只在一端栈顶进行。
2):队列的特性
队列是先进先出,可以认为数据是从一端进,从另一端出。
题目要求就是使用两个先进后出的栈来实现,先进先出的队列

三:思路分析

  1. 定义两个静态栈变量,一个为in,用来压入数据,另一个为out,用来弹出数据

  2. 先将out中的数据弹出并压入到in中。
    注意:out中的数据已经是倒叙的!!如输入1,2,3,4;在out中为4,3,2,1!
    为什么要这样呢?下面有解释!!!

  3. 然后将待压入的数据压入到in栈中

  4. 最后将in栈中的数据全部pop出,并push进out栈中。

  5. 如果想要弹出数据,直接冲out栈中弹出数据就可以了。

为什么要有第二个步骤呢?
我们来看如果没有第二个步骤会是怎么样:
如果现在我想要将1,2,3,4压入我们用栈实现的队列中,那么数据直接进入in栈中
如图:
栈
在将in中的数据弹出,并压入到out中
栈2
这时可以将数据从out栈中pop出去,可以实现队列先进先出的要求,但是,这时如果我想要在次将数据压入栈中,这时in栈中为空,反转后就到了out栈中的数据1的上面,就不再满足队列先进先出的特性了!

四:代码

import java.util.Stack;

/*
    使用两个栈来实现队列,完成队列的push和pop两个操作
    队列特性:
        数据先进先出。

    栈特性:
        数据先进后出


 */
public class Demo09 {

    public static void main(String[] args) {

        push(1);
        push(2);
        push(3);
        push(4);

        Integer pop = pop();
        Integer pop1 = pop();
        Integer pop2 = pop();
        System.out.println(pop);
        System.out.println(pop1);
        System.out.println(pop2);

    }

    static Stack<Integer> in = new Stack();
    static Stack<Integer> out = new Stack();

    //入栈
    public static void push(Integer num){

        //先将out栈中的数据,全部弹出放入到in栈中
        if (!out.isEmpty()){
            while (!out.isEmpty()){
                in.push(out.pop());
            }
        }

        //压入数据
        in.push(num);

        //将in这个栈中的所有数据全部出栈并放入到out栈中
        while (!in.isEmpty()){
            out.push(in.pop());
        }

    }

    //出栈
    public static Integer pop(){
        //从out栈中出栈
        Integer pop = out.pop();
        return pop;
    }
}
发布了24 篇原创文章 · 获赞 5 · 访问量 2053

猜你喜欢

转载自blog.csdn.net/weixin_43288447/article/details/104267817