题目:使用两个队列实现一个栈
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()); } }