剑指Offer05 - 用两个栈实现队列

Posted jianminglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer05 - 用两个栈实现队列相关的知识,希望对你有一定的参考价值。

重建二叉树

时间限制1秒
空间限制32768K
本题知识点队列
题目描述

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

public class Solution 
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) 
        
    
    
    public int pop() 
    
    

思路分析:

操作情况依次经历下述变化:

  1. 两栈都空

  2. -> stack1不空 stack2空

  3. -> stack1空 stack2不空

  4. -> 两栈都不空

两栈都空

两栈都空 stack1=[] stack2=[] 操作步骤
入栈 1, 2 stack1=[2, 1] stack2=[] 2 * stack1.push
出栈 stack1=[] stack2=[] return null

stack1不空 stack2空

1不空 2空 stack1=[2, 1] stack2=[] 操作步骤
入栈 3, 4 stack1=[4, 3, 2, 1] stack2=[] 2 * stack1.push
出栈 stack1=[] stack2=[2, 3, 4] 4 * stack1.pop
4 * stack2.push
return stack2.pop

stack1空 stack2不空

1空 2不空 stack1=[] stack2=[2, 3, 4] 操作步骤
入栈 5, 6 stack1=[6, 5] stack2=[2, 3, 4] 2 * stack1.push
出栈 stack1=[] stack2=[3, 4] return stack2.pop

两栈都不空

两栈不空 stack1=[6, 5] stack2=[2, 3, 4] 操作步骤
入栈 7, 8 stack1=[8, 7, 6, 5] stack2=[2, 3, 4] 2 * stack1.push
出栈 stack1=[6, 5] stack2=[3, 4] return stack2.pop

小结:

  1. 入栈情况:总是 stack1.push
  2. 出栈情况:
    • stack2 为空:将所有 stack1 元素入栈到 stack2,再执行 stack2.pop
    • stack2 不空:stack2.pop

解答:

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() 
        // 若 stack2 为空:将所有 stack1 元素入栈到 stack2
        if(stack2.empty())
            while(!stack1.empty())
                stack2.push(stack1.pop());
            
        
        return stack2.pop();
    

以上是关于剑指Offer05 - 用两个栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer(C++版本)系列:剑指 Offer 09 用两个栈实现队列

剑指Offer05 - 用两个栈实现队列

剑指offer 05 用两个栈实现队列

剑指offer05- 用两个栈实现队列(java)

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

剑指Offer打卡09.用两个栈实现队列