1. 程式人生 > >劍指offer--演算法題--07--兩個佇列實現一個棧

劍指offer--演算法題--07--兩個佇列實現一個棧

題目:使用兩個佇列實現一個棧



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());
	}
}