面試題09. 用兩個棧實現隊列

面試題09. 用兩個棧實現隊列

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )

  • 一個隊列中的數兩次經過棧,還是保持先進先出的性質。
  • 如果我們讓所有的數都順序經過A和B,那麼隊列就仍然保持原來的性質。如果要刪隊列頭部的數,那麼就是刪除棧B的棧頂元素。
  • 如果棧B爲空並且棧A不爲空,說明還有一部分元素沒有兩次經過棧,並且我們要刪除的元素在棧A的底部,將棧A的元素依次加入到棧B中,再刪除棧B的棧頂元素即可。
  • 兩棧均爲空,返回-1
class CQueue {
	Stack<Integer> A;	//A作存數
	Stack<Integer> B;	//B作輔助
    public CQueue() {
    	A = new Stack<Integer>();
    	B = new Stack<Integer>();
    }
    
    public void appendTail(int value) {
    	A.add(value);
    }
    
    public int deleteHead() {
    	if(A.isEmpty() && B.isEmpty()) {	//兩棧均空
    		return -1;
    	}else if(B.isEmpty()) {	//A不空,B空
    		while(!A.isEmpty()) {
    			B.add(A.pop());
    		}
    		return B.pop();
    	}else {	//B不空,此時A可能有元素,也可能沒有
    		return B.pop();
    	}
    }
}


/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

ps:調用stack類基本很少會碰到溢出,但是筆試的時候,入隊一定要判滿,出隊一定要判空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章