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

2021-07-11 23:00:39 字數 1224 閱讀 6465

在做這道題之前,我們首先要搞清楚佇列和棧的特點。

佇列:先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行;

棧:後進先出,即插入與刪除資料均在棧頂進行。

pop:

如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資料時,我們可以先將資料push到乙個佇列當中,pop時,因為佇列是先進先出的,所以我們可以將隊尾的元素保留下來,其餘元素按照出隊的順序入隊到另外乙個佇列當中,然後pop第乙個佇列的最後乙個元素,這樣就實現了棧的刪除操作。

上圖是棧進行一次刪除資料的示意圖,當我們需要再次刪除資料時,我們需要將queue2的隊尾資料儲存下來進行pop,其餘資料入隊到另外乙個佇列當中。就這樣利用兩個佇列來對資料進行來回交換實現棧。

寫**的時候需要注意當兩個佇列都為空的時候是沒有辦法pop資料的。

push:

當我們要插入資料的時候,我們需要對佇列進行判斷,將資料插入到非空的佇列當中。這樣的話pop時我們分情況討論的時候只用分隊列為空和不為空兩種情況,有利於**的編寫。若是插入資料時將資料插入到非空佇列,那就可能出現第三種情況,兩個佇列都不為空,這個時候寫的**就比較複雜了。所以選擇第一種方式。

#include#includeusing namespace std;

templateclass satck

~satck()

{}void push(const t& data)

else if (queue2.size() > 0)//q2非空

else//q1,q2都為空

}void pop()

queue1.pop();

}else

queue2.pop();}}

t& top()

else

}bool empty()

else

return false ;

}size_t size()

else if (queue1.size() > 0)

else

}private:

queuequeue1;

queuequeue2;

};void funtest()

int main()

面試題8 用兩個棧實現乙個佇列

templateclass cqueue 解答 這題仔細分析下,應該可以做出來。有兩個棧stack1和stack2。那麼,如果stack2為空,我們將stack1 出佇列逆序 的數壓入到stack2 出佇列順序 在對stack2進行出棧。如果stack2非空,直接出棧。實現如下 include in...

面試題07 用兩個棧實現乙個佇列

題目描述 用兩個棧實現乙個佇列。分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。基本知識 1 佇列的操作 offer 隊尾插入元素,插入失敗返回false。poll 隊頭取出元素 linkedlist類實現了queue介面,因此我們可以把linkedlist當成queue來用。2 實現棧的操作...

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

首先,我們知道 棧 是先進後出的,佇列 是先進先出的。我們先在 stack1 中插入 a b c d 四個字母。此時,我們如果要做出隊操作的話,a 應該首先被 pop 出來,那麼我們想到,把 stack1 中的所有數 先 pop 出來,那麼 a 就可以出隊了。這時,我們可以利用 stack2 我們將...