剑指offer(五)用两个栈模拟队列

写在前面:

为了增长一下自己的数据结构能力,也为了面试准备,准备将剑指Offer做一下,并与各位分享,希望各位可以对代码以及思路提提建议,欢迎志同道合者,谢谢。

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

思路:
先分析一下栈和队列,,栈先入先出,队列先入先出,那么怎么模拟呢。有数据 1,2,3,4进队列,,,那么出队顺序应该也是1,2,3,4 但是对于栈来说,出栈顺序是4,3,2,1 但是我们可以再将这个数据按照这个顺序压入另一个栈中,入栈顺序为4,3,2,1 那么出栈顺序就为1,2,3,4

重点:

代码思路是,在入队的时候将数据(三个数据)压入栈1,然后在出队将栈1的数据弹出然后压入栈2(这时候栈2中有三个数据),然后弹出栈2的数据(弹出一个,还剩两个),这就是我们上面的思路,,,,but,重点来了,如果弹出数据之后,然后我们现在又要入队数据了,我们把数据压入栈1 ,然后出队数据,我们把栈1的数据压入栈2,然后弹出栈2的数据,注意,这个数据就是我们刚刚入队的数据,但是我们栈里还有以前的数据呢,是不是顺序就乱了,,,,所以我们在弹出数据之后,应该在把栈2中的数据再次压入栈1中,维持以前数据的顺序,如果你要是在加入数据,也就是压入栈1 的栈顶,弹出的时候,将栈1 的数据压入栈2 ,那么刚刚入队的数据,就在栈2的栈底,也就是会最后一个出场,也就对应了队列的先入先出的顺序,

代码实现:

package com.itzmn.offer;

import java.util.Stack;

/**
 * @Auther: 张梦楠
 * @Date: 2018/7/28 10:05
 * 简书:https://www.jianshu.com/u/d611be10d1a6
 * 码云:https://gitee.com/zhangqiye
 * @Description:  使用两个栈模拟队列
 */
public class Offer5 {

    /**
     *  stack1 用来入队
     *  stack2 用来出队
     *
     *  先入先出
     *    1, 2, 3 进栈,出栈顺序为  3,2,1
     *    那么将这三个数在压入第二个栈中  入栈顺序为 3,2,1
     *    然后出栈顺序就为 1,2,3
     *    即可模拟  队列,先入先出
     *      栈是先入后出的
     *
     */

    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public static void main(String[] args) {

        Offer5 offer5 = new Offer5();

        offer5.pop();

        offer5.push(1);
        offer5.push(2);
        offer5.push(3);
        System.out.println(offer5.pop());
        offer5.push(5);
        offer5.push(4);

        System.out.println(offer5.pop());
        System.out.println(offer5.pop());
        System.out.println(offer5.pop());

    }

    public void push(int node) {

        stack1.push(node);

    }

    public int pop() {


       while (!stack1.empty()){
            stack2.push(stack1.pop());
        }
        if (stack2.isEmpty()){
            System.out.println("队列为空");
            return -1;
        }
        Integer pop = stack2.pop();

       //将栈中剩余的数据重新压入栈1中,是因为如果后面还有别的数据要入队,也就是入栈的话,可以有顺序
       while (!stack2.isEmpty()){
           stack1.push(stack2.pop());
       }

        return pop;
    }

}

希望大家可以多多指点,优化一下,
QQ群:552113611

    原文作者:z七夜
    原文地址: https://www.jianshu.com/p/1190e9d4d503
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞