剑指Offer Java05 拓展 用两个队列实现一个栈的push和pop操作
package offer5.extend;
import offer5.Offer5;
import java.util.LinkedList;
import java.util.Queue;
/**
* 用两个队列实现一个栈的push和pop操作
* <p>
* 思路:
* <p>
* 有两个队列A、B
* <p>
* 先将元素1 push进队列B中
* 判断队列B中是否有元素
* 如果队列B为空,
* 不进行操作
* 如果队列B不为空,
* 则将原先队列B中的元素pop,并push进队列A
* 然后将队列A中的元素pop,并push队列B
* <p>
* 总结来说:就是通过两次交换,将后进先出的顺序换为先进后出
*
* @author RhymeChiang
* @date 2018/01/15
**/
public class Offer5_extend<E> {
private Queue<E> queueA;
private Queue<E> queueB;
{
queueA = new LinkedList<>();
queueB = new LinkedList<>();
}
/**
* 模拟栈的push操作
*
* @param e
*/
public void push(E e) {
//记录队列B当前的大小
int queueBlength = queueB.size();
// 先将元素push进队列B
queueB.add(e);
// 如果队列B不为空,
if (!queueB.isEmpty()) {
// 则先将队列B中的元素pop,push进队列A
for (int i = 0; i < queueBlength; i++) {
queueA.add(queueB.poll());
}
// 将队列A中的元素pop.push进队列B
while (!queueA.isEmpty()) {
queueB.add(queueA.poll());
}
}
}
/**
* 模拟栈的pop操作
*
* @return
*/
public E pop() {
if (!queueB.isEmpty()) {
return queueB.poll();
}
return null;
}
public static void main(String[] args) {
Offer5_extend<Integer> extend = new Offer5_extend<>();
extend.push(1);
extend.push(2);
extend.push(3);
System.out.println(extend.pop());
System.out.println(extend.pop());
System.out.println(extend.pop());
}
}
测试结果: