题目:使用两个队列实现一个栈
package jzoffer;
import java.util.ArrayDeque;
import java.util.Queue;
/*
* 上一个算法用两个栈实现了一个队列,其实主要是实现队列的add()和poll()这两个方法,实现队列的先进先出规则
* 那我们这次用两个队列实现一个栈,其实也就是实现栈的push()和pop()这两个方法
* 还是要实现栈的先进后出规则
*/
public class StacksWithTwoQueue {
Queue<Integer> queue1 = new ArrayDeque<>(); //在这里先创建两个队列
Queue<Integer> queue2 = new ArrayDeque<>();
public void push(int node){//先实现栈的push方法 先进后出原则
if(queue1.isEmpty() && queue2.isEmpty()){
queue1.add(node);//如果两个队列都为null的话,那么我们优先往队列1的里面添加元素然后结束方法
return; //添加的话队列和栈差不多
}
if(queue1.isEmpty() && !queue2.isEmpty()){//如果队列1为null 2 不为null的话
queue2.add(node);//那么我们直接给队列2里面添加
return;
}
if(queue2.isEmpty()){//如果队列2为null的话,向1里面进行添加元素
queue1.add(node);
return;
}
}
public int pop(){//紧接着我们来实现栈的pop方法 先进后出原则
if(queue1.isEmpty() && queue2.isEmpty()){ //如果两个队列都为nll的话,需要抛出异常
try {
throw new Exception("stack is empty");
} catch (Exception e) {
e.printStackTrace();
}
}
if(queue1.isEmpty()){
while(queue2.size()>1){//如果1为空的话,小判断2的大小,如果个数大于1的话-
queue1.add(queue2.poll());//我们将2里面的弹出一个放入队列1
}
return queue2.poll(); //如果2里面小于一个的话那么我们直接弹出就好了
}
if(queue2.isEmpty()){//下来我们按照上面继续判断2里面的
while(queue1.size()>1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return 0;
}
public static void main(String[] args) {
StacksWithTwoQueue awtq = new StacksWithTwoQueue();
awtq.push(1);
awtq.push(2);
awtq.push(3);
awtq.push(4);
System.out.println(awtq.pop());
System.out.println(awtq.pop());
awtq.push(5);
System.out.println(awtq.pop());
System.out.println(awtq.pop());
System.out.println(awtq.pop());
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6bb5ef5eb700712fc141f7210532ae27.png)