題目:用兩個棧實現一個隊列。隊列的聲明以下,請實現它的兩個函數appendTail和deletedHead,分別完成在隊列尾部插入節點和在隊列頭部刪除節點的功能。node
分析:
咱們經過一個具體的例子來分析該隊列插入和刪除元素的過程。首先插入一個元素a,不妨先把它插入到stack1,此時stack1 中的元素有{a},stack2爲空。再壓入兩個元素b和c,仍是插入到stack1中,此時stack1中的元素有{a,b,c},其中c位於棧頂,而stack2仍然爲空。app
這個時候,咱們試着從隊列中刪除一個元素。按照隊列先進先出的規則,因爲a比b、c先插入到隊列中,最早被刪除的元素應該是a。元素a存儲在stack1中,但並不在棧頂上,所以不能直接被刪除。注意到stack2咱們還一直沒有使用過,如今是讓stack2發揮做用的時候了。若是咱們把stack1中的元素逐個彈出並壓入stack2,元素在stack2中的順序正好和原來的stack1中的順序相反。所以通過3次彈出stack1和壓入stack2操做以後,stack1爲空,而stack2中的元素是{c,b,a},這個時候就能夠彈出stack2的棧頂a了。此時的stack1爲空,而stack2的元素爲{c,b},其中在棧頂,如圖所示: 函數
代碼以下spa
//2個棧實現隊列 class CQueue<E>{ private Stack<E> stack1; private Stack<E> stack2; public CQueue(){ stack1=new Stack<>(); stack2=new Stack<>(); } //尾部插入,直接插入stack1 public void appendTail(E node){ stack1.push(node); } //從頭部刪除元素 public E deleteHead(){ if(stack2.size()==0){ if(stack1.size()==0){ throw new RuntimeException(); }else{ while(stack1.size()!=0){ stack2.push(stack1.pop()); } } } return stack2.pop(); } }