[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列

文章目录

  • 1、题目描述
  • 2、解题思路
  • 3、解题代码
  • 4、解题心得

1、题目描述

  【JZ05】用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
  知识点:队列,栈
  难度:☆

2、解题思路

  栈的特点是:先入后出(FILO)
  队列的特点是:先入先出(FIFO)
  完成队列的Push和Pop操作,那我们逐一分析:
  1、Push操作:只需拿其中一个栈来保存即可,如stack1;
  2、Pop操作:要把先存进来的先输出,此时之前进来的都在stack1的底部,所以我们需要把stack1的元素pop到stack2,这时我们已存的元素顺序就调换过来了,然后pop出stack2的元素即可。
  流程分析:
  1、队列执行3次push操作,分别是{1,2,3}后:
[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列_第1张图片
  2、此时执行一次pop,分为两个阶段,首先是stack1先pop到stack2:
[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列_第2张图片
  然后stack2执行pop:
[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列_第3张图片
  3、假设此时队列又push了一个数字4:
[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列_第4张图片
  4、然后队列又执行一次pop,如果我们又按照上面的,把stack1执行pop到stack2,然后stack2执行pop,就违反了队列先进先出原则,我们应该只执行stack2:
[2021校招必看之Java版《剑指offer》-05] 用两个栈实现队列_第5张图片
  5、stack2是比较早进来的,肯定要pop完再考虑把stack1倒入stack2中。

3、解题代码

package pers.klb.jzoffer.simple;

import java.util.Stack;

/**
 * @program: JZoffer
 * @description: 用两个栈实现队列
 * @author: Meumax
 * @create: 2020-06-18 09:24
 **/
public class QueueImplement {
     

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

    public void push(int node) {
     
        stack1.push(node);
    }

    public int pop() {
     
        if (stack2.isEmpty()) {
     
            while (!stack1.isEmpty()) {
     
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        } else {
     
            return stack2.pop();
        }
    }
}

4、解题心得

  本题难度较低,关键是需要细心,整体上把stack1当成存,stack2当成取,在stack2没有取完之前,不把stack1倒入到stack2,因为stack1倒入stack2的操作可以看成是转换顺序。

你可能感兴趣的:(剑指offer(Java语言),队列,栈,java,剑指offer,数据结构)