【剑指offer】用两个栈实现队列 -- Java实现

题目描述

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

思路分析

栈的特性:先进后出 ;队列的特性:先进先出

现在有两个栈,分别是stack1和stack2,模拟队列先进先出的特性

当我们往模拟队列中插入元素1,2,3时,此时栈情况:

stack1:{1,2,3}

stack2:{}

当我们要弹出第一个元素时,由于队列先进先出的特性,我们需要弹出的第一个元素是3,

所以我们需要先把stack1中所有元素逐个弹出压入stack2,此时栈情况为:

stack1:{}

stack2:{3,2,1}

再从stack2中弹出第一个元素,此时栈情况为:

stack1:{}

stack2:{3,2}

如果我们再往模拟队列中插入元素4时,此时栈情况为:

stack1:{4}

stack2:{3,2}

根据队列先进先出的特性,如果我们再次弹出元素,只需将stack2的元素依次弹出即可

stack1:{4}

stack2:{}

然后再将stack1的元素弹出压入stack2

stack1:{}

stack2:{4}

最后从stack2中弹出

stack1:{}

stack2:{}

实现了模拟队列的push和pop操作

最后总结为:如果要往模拟队列插入元素,只要将元素压入stack1

      如果要从模拟队列弹出元素,当stack2不为空,弹出stack2栈顶元素;当stack2为空,将stack1元素依次弹出压入stack2,再弹出stack2栈顶元素

核心代码

import java.util.Stack;

public class Solution {
  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.size()<=0){
      while(stack1.size()!=0){
        stack2.push(stack1.pop());
      }
    }
    return stack2.pop();
  }
}

posted @ 2021-02-22 14:22  codesheep!  阅读(90)  评论(0)    收藏  举报