面試題7 用兩個棧實現佇列

2021-07-05 07:20:06 字數 1355 閱讀 7861

template

class cqueue

;

在上述佇列的宣告中可以看出,乙個佇列包含了兩個棧stack1和stack2,因此這道題的意圖是要求我們操作這兩個「先進後出」的棧實現乙個「先進先出」的佇列cqueue。

我們通過乙個具體的例子來分析往該佇列插入和刪除元素的過程。首先插入乙個元素a,不妨先把它插入到stack1,此時stack1中的元素有,stack2為空。再壓入兩個元素b和c,還是插入到stack1中,此時stack1中的元素有,其中c位於棧頂,而stack2仍然是空的(如圖2.8(a)所示)。

這個時候我們試著從佇列中刪除乙個元素。按照佇列先進先出的規則,由於a比b、c先插入到佇列中,最先被刪除的元素應該是a。元素a儲存在stack1中,但並不在棧頂上,因此不能直接進行刪除。注意到stack2我們一直還沒有使用過,現在是讓stack2發揮作用的時候了。如果我們把stack1中的元素逐個彈出並壓入stack2,元素在stack2中的順序正好和原來在stack1中的順序相反。因此經過3次彈出stack1和壓入stack2操作之後,stack1為空,而stack2中的元素是,這個時候就可以彈出stack2的棧頂a了。此時的stack1為空,而stack2的元素為,其中b在棧頂(如圖2.8(b)所示)。

如果我們還想繼續刪除佇列的頭部應該怎麼辦呢?剩下的兩個元素是b和c,b比c早進入佇列,因此b應該先刪除。而此時b恰好又在棧頂上,因此直接彈出stack2的棧頂即可。這次彈出操作之後,stack1中仍然為空,而stack2為(如圖2.8(c)所示)。

從上面的分析中我們可以總結出刪除乙個元素的步驟:當stack2中不為空時,在stack2中的棧頂元素是最先進入佇列的元素,可以彈出。如果stack2為空時,我們把stack1中的元素逐個彈出並壓入stack2,。由於先進入佇列的元素把壓到stack1的低端,經過彈出和壓入之後就處於stack2的頂端了,又可以直接彈出。

接下來再插入乙個元素d。我們還是把它壓入stack1(如圖2.8(d)所示),這樣會不會有問題呢?我們考慮下一次刪除佇列的頭部stack2不為空,直接彈出它的棧頂元素c(如圖2.8(e)所示)。而c的確是比d先進入佇列,應該在d之前從佇列中刪除,因此不會出現任何矛盾。

面試題7 用兩個佇列實現棧

題目 用兩個佇列實現乙個棧。實現兩個函式push和pop,完成從棧頂插入和刪除結點的功能。思路 1 入棧 總是插入到非空佇列 中 2 出棧 將非空佇列中的前n 1個元素依次出佇列push進空佇列中,然後將最後乙個元素出佇列,完成出棧操作。c include stdafx.h include incl...

面試題7 用兩個棧實現佇列

templateclass queue queue t deletehead private stacks1 stacks2 首先,我們需要知道佇列和棧他們各自的特點。他們都是乙個線性資料結構。在stl裡面,他們是作為容器介面卡出現的。儘管如此,棧和佇列在邏輯和對資料的操作方式上還是有很大的區別的。...

面試題7 用兩個棧實現佇列

題目 用兩個棧實現乙個佇列。結點的功能。1 template 2 class cqueue 3 分析 棧的特點是 先出,佇列的特點是先入先出。首先按照入佇列的順序將資料壓入棧stack1中,那麼當需要刪除隊首元素時意味著要刪除棧底元素,此時可利用另乙個棧進行資料轉移,按照stack1出棧的順序將資料...