劍指offer面試題9 用兩個棧實現佇列

2021-09-28 20:57:50 字數 1851 閱讀 6247

templateclass cqueue 

;

佇列是先進先出,棧是先進後出。這題題目給出了兩個棧,首先假設我們往乙個棧裡面壓入了三個元素a、b、c。作為乙個佇列,如果我們壓入了a、b、c,那麼先出的會是a。但是棧彈出的會是c,那麼該怎麼輸出a呢,這裡注意到我們利用了乙個棧,還有乙個棧沒有使用,如果我們把第乙個棧裡面的元素依次壓入第二個棧裡面,那麼第二個棧裡面從上到下會是c、b、a,只要把第二個棧的首元素彈出去就可以。再來看看插入操作,插入的時候直接把元素壓入第乙個棧,輸出的時候將元素取出並且壓入第二個棧再進行出棧操作即可。

複習:

要注意的是,在複製資料的時候用引用可以節省時間,在往stack2複製資料結束之後,要判斷佇列裡面是否還有元素。還要注意怎麼定義模板類裡面的函式。

二刷**:

templateclass cqueue

;templatet cqueue::deletehead()

t head = stack2.top;

stack2.pop();

} if(stack2.size()==0)//判斷佇列是否已經沒有元素

throw new exception("queue is empty")

t head = stack2.top();

stack2.pop;

return head;

}

下面圖表示兩個佇列,當向棧中壓入a、b、c三個數之後,我們要彈出c,這個時候需要將a,b出佇列queue1並且入隊到queue2中,再刪除c,彈出b的過程同理。壓入d的時候直接入隊到a後面就好了。

**:

templateclass cstack

;templatet cstack::deletehead()

queue1.pop();

return temp;

} else if (queue2.size() != 0)

queue2.pop();

return temp;

} else throw new exception("stack is empty");

}//這個**是自己寫的,也不知道對不對,歡迎談論

複習:思路還是差不多的,就是還有注意對棧為空的情況的判斷。

二刷**:

templateclass cqueue

;templateclass cstack

;templatet cstack::deletehead()

t head = queue1.front();

queue1.pop();

} else if(queue2.size()>1)

t head = queue2.front();

queue2.pop();

} else throw new exception("stack is empty");

return head;

}

劍指Offer 面試題9用兩個棧實現佇列

思路 stack1存放著逆序的剩餘佇列,stack2存放著正序的佇列。pop的時候,當stack2為空,表示序列都在stack1中,則從stack1中迴圈pop後push到stack2,再從stack2中pop出隊首 stack2不為空則直接pop。push的時候,當stack2不為空,把資料從st...

劍指offer 面試題9 用兩個棧實現佇列

棧後進先出,佇列先進先出。1.當stack2不為空時,stack2中的棧頂元素是最先進入佇列的元素,可以彈出。2.當stack2為空時,把stack1中的元素逐個彈入並壓入stack2中,先入stack1的元素這時在stack2頂部,這時彈出stack2就完成了佇列 書上的圖更便於理解 class ...

劍指offer 面試題9 用兩個棧去實現佇列

題目 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 由於棧是後入先出,佇列是先入先出。實現時,輸入元素時,將元素壓入stack1中,刪除元素時,先將stack1中的元素出棧,全部壓入stack2中再出棧,這樣元素的位置將倒置,實現先入先出的功能。操作 入隊 ...