剑指offer(五) 用两个栈实现队列

用两个栈实现队列

    • 题目描述
    • 思路
    • 题解

题目描述

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

思路

此题与【Leetcode 232】 Implement Queue using Stacks - EASY类似,上篇中有详细的思路与图解。

stack1用于存放倒序后的数据,stack2用于实现倒序。

正常的思路是,每次push进入stack1之后,都将所有元素从stack1转移到stack2,然后再换回stack1;每次pop时,都从stack1中取出栈顶元素。
但这样push()操作的时间复杂度很高。

换个思路,每次push,都入栈stack2,每次pop时,都先将所有元素从stack2转移到stack1,再取出栈顶元素,然后将所有元素转移回stack2。
但这样pop()操作的时间复杂度很高。

于是我考虑到了push和pop操作完全是随机的,为了避免在两个栈之间频繁地进行无用的交换,只在需要push的时候将所有数据移动到stack2中,这样连续的pop操作避免无用功,而只需要在pop的时候将所有数据移动到stack1,避免了连续push时的无用功。

题解

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
        stack2.push(node);
    }
    
    public int pop() {
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        return stack1.pop();
    }
}

你可能感兴趣的:(剑指offer)