题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路
首先弄清楚栈先进后出,队列先进先出的特性。既然用到两个栈,而且栈特性先进后出,可以用一个栈专门存储数据,当需要出队列的时候,将此栈中内容压入另一个栈,这样就可以实现先进先出的队列了。
但是,注意下小细节。来看下面这个小例子
push(1),push(2),push(3),pop(),pop(),push(4),pop()
如果使用队列,输出的结果应该是1,2,3,4;但是如果没有注意细节,就会像下方这样
细节:栈1进了新的元素想往栈2压的时候,栈2必须把上一批的元素清空了才行。即,栈2为空时才允许栈1往外弹元素并压到栈2里。
解题代码
核心方法
// 进队列
public static void push(int node) {
stack1.push(node);
}
// 出队列
public static int pop() {
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
完整案例
import java.util.*;
/**
* @program: LeeCode
* @description: 用两个栈实现队列
* @author: Mario
* @create: 2019-09-16 12:23
* @version: 1.0
*/
public class TwoStackToQueue {
// 双栈
private static Stack<Integer> stack1 = new Stack<>();
private static Stack<Integer> stack2 = new Stack<>();
public static void main(String[] args) {
push(1);
push(2);
push(3);
System.out.println(pop());
System.out.println(pop());
push(4);
System.out.println(pop());
push(5);
System.out.println(pop());
System.out.println(pop());
}
// 进队列
public static void push(int node) {
stack1.push(node);
}
// 出队列
public static int pop() {
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}