劍指offer--演算法題--07--兩個佇列實現一個棧
阿新 • • 發佈:2019-02-15
題目:使用兩個佇列實現一個棧
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()); } }